解题思路:
我认为最值得一提的是我收获了一个方法,来判断队列是否满足要求
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语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复