题意:有k个好人和k个坏人,问想要先处死k个坏人的最小间隔为多少?
思路:k比较小(k<=14),所以对于k进行枚举计算,注意把结果存一下。枚举时的递推式还是需要想一下的。b=(a+m-1)%(n-i+1); (i>=1 , 总人数2n,人编号从0~2n-1,则n-i为第i轮剩余的人数),相当于每轮都把比死者序号大的人的序号减1。
#include <stdio.h>
#include <string.h>
int res[16];
int n;
int main(){
memset(res,0,sizeof(res));
while(scanf("%d",&n) && n){
int i,m,a,b;
if(res[n]){
printf("%d\n",res[n]);
continue;
}
a = 0;
for(i = 1,m = 1;i<=n;i++){
b = (a+m-1)%(2*n-i+1);
a = b;
if(b < n){
i = a = 0;
m++;
}
}
res[n] = m;
printf("%d\n",m);
}
return 0;
}
本文探讨了一个关于处决坏人的问题,通过枚举计算找到最小间隔,利用递推公式b=(a+m-1)%(n-i+1)来更新序列,确保每次处决的对象都是坏人。
1275

被折叠的 条评论
为什么被折叠?



