2012年(12)
分类: C/C++
2012-05-30 13:30:56
点击(此处)折叠或打开
点击(此处)折叠或打开
本题过程较繁琐,但拆分成每一步之后都不难实现:
第一步:将好人坏人按要求排列好(使用数组实现)。第二步:消去要求的人。第三步:对数组重排(即补充消去的人的位置)
用循环对每一个可能的数进行测试即可。
最后将所有可能取值保存到数组中(否则运行时会超时)。点击(此处)折叠或打开
- #include <stdio.h>
- int a[30]={2};
- int judge (int n,int k);
- int main ()
- {
- int i,k=3,b[14];
- for(k=1;k<14;k++)
- for (i=1;;i++)
- {
- if (judge(i,k))
- {
- b[k]=i;
- break;
- }
- }
- while (scanf("%d",&k)&& k)
- printf("%d\n",b[k]);
- return 1;
- }
- int judge (int n,int k)
- {
- int sumnow,i,j;
- for (i=1;i<=k;i++)
- a[i]=1;
- sumnow=2*k;
- i=0;
- while (sumnow!=k)
- {
- i=i+n;
- if (i>sumnow)
- i=i%sumnow;
- if (i==0)
- i=sumnow;
- if (a[i]==1)
- break;
- else
- a[i]=0;
- for (j=k;j<sumnow-1;j++) //实现重排列
- {
- if (a[j]==0)
- for (;j<sumnow-1;j++)
- a[j]=a[j+1];
- }
- sumnow--;
- i--;
- }
- if (sumnow==k)
- return 1;
- else return 0;
- }