解题思路:
我认为最值得一提的是我收获了一个方法,来判断队列是否满足要求
1元加1
2元减1
若小于0则不符合要求,排序失败
int panduan(int *A,int M,int *sum){
int yiyuan=0;
for(int i=0;i<M;i++){
if(A[i]==1)
yiyuan++;
else
yiyuan--;
if(yiyuan<0)
return 0;
}
(*sum)++;
return 0;
}
这是我学到的最大的知识点
排列我还不是很懂
注意事项:
参考代码:
#include<stdio.h>
#include<malloc.h>
void format(int *A,int N,int K);
void pailie(int *A,int index,int length,int *sum);
void swap(int *x,int *y);
int panduan(int *A,int M,int *sum);
int main(){
int M,N,K,sum=0;
int *A;
while(scanf("%d %d %d",&M,&N,&K)!=EOF)
{
sum=0;
A=(int *)malloc(M*sizeof(int));
format(A,N,K);
pailie(A,0,M,&sum);
printf("%d\n",sum);
}
return 0;
}
void format(int *A,int N,int K){ //把所有的孩子手中的钱排进A中,先1后2
for(int i=0;i<(N+K);i++){
if(i<N)
A[i]=1;
else
A[i]=2;
}
}
void pailie(int *A,int index,int length,int *sum){ //排列
int j=0;
if(index==length){
panduan(A,length,sum);
}else{
for(j=index;j<length;j++){
swap(&A[j],&A[index]);
pailie(A,index+1,length,sum);
swap(&A[j],&A[index]);
}
}
}
void swap(int *x,int *y){ //两个变量互相交换值
int z=(*x);
(*x)=(*y);
(*y)=z;
}
int panduan(int *A,int M,int *sum){
int yiyuan=0;
for(int i=0;i<M;i++){
if(A[i]==1)
yiyuan++;
else
yiyuan--;
if(yiyuan<0)
return 0;
}
(*sum)++;
return 0;
}
0.0分
0 人评分
字符串输入输出函数 (C++代码)(都当成字符串吧hhhhhhhh)浏览:493 |
求圆的面积 (C语言代码)浏览:1270 |
Pascal三角 (C语言代码)浏览:1188 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:1420 |
WU-判定字符位置 (C++代码)浏览:1406 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:595 |
震宇大神的杀毒软件 (C语言代码)浏览:1080 |
良心推荐——>题解1049:C语言程序设计教程(第三版)课后习题11.1 (C语言描述——简单明了,时间复杂度低)浏览:1287 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:560 |
哥德巴赫曾猜测 (C语言代码)浏览:724 |