Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2240 Accepted Submission(s): 1361
比赛时候差一点就推出来了 自己比赛时太容易紧张了 尤其是跟队友一起时,唉 还是心态不行
题意:总共有2*k个人站成一个环,前k个人是好人,后k个人是坏人,现在要处决这2*k个人要求后k个坏人要在好人之前死,让找一个最小的m(按照圆圈数m个人第m个人处死,然后从这个处死的人的下一位为起点继续数m个以此类推,直至杀死所有人)使得坏人先死
题解:当前要处死的人为kill=(kill+m-1)%n (n为当前活着的人的数量)如果kill等于0 证明是要处死第n个人所以kill=n
我直接用函数求解超时了 ,因为数据不大 所以我直接吧14个数打表输出了
#include<stdio.h> #include<string.h> #include<cstdio> #include<string> #include<math.h> #include<algorithm> #define LL long long #define PI atan(1.0)*4 #define DD double #define MAX 1100 #define mod 100 #define dian 1.000000011 #define INF 0x3f3f3f using namespace std; int f[20]; int s[20]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,13482720}; int fun(int k,int m) { int kill,i,j,n; n=2*k; kill=1; for(i=1;i<=k;i++) { kill=(kill+m-1)%n; if(kill==0) kill=n; else if(kill<=k) return 0; n--; } return 1; } int main() { int n,m,j,i,t,k; while(scanf("%d",&k),k) { // for(i=1;i<=14;i++) // { // for(j=1;;j++) // { // if(fun(i,j)) // { // f[i]=j; // break; // } // } // } printf("%d\n",s[k]); } return 0; }
原文:http://www.cnblogs.com/tonghao/p/5329895.html