4 条题解
-
36
提示
只需要保证前k次出列的人编号都大于k。
完整思路
本题直接模拟每一次出列的过程,会时间超限。 但实际上,不需要知道出列的人确切的编号,只需要保证每次出列的人编号大于k就可以。 可以在每次有人出列后,都把比这个人编号大的人的编号减少1,保证编号连续。 这样一来,每次用加法和取余就能够计算出下一个出列的人。 只要每次出列的人编号都大于k,那么编号小于k的人不会受影响,因此这样是可行的。 从小到大枚举m,输出第一个满足条件的m即可。
代码
#include <bits/stdc++.h> using namespace std; int k; int main() { cin >> k; for (int m = 2; ; m++) { bool ok = true; int cur = 1, n = 2 * k; for (int i = 1; i <= k; i++) { cur += m - 1; cur = (cur - 1) % n + 1; if (cur <= k) { ok = false; break; } else { n--; } } if (ok) { cout << m; return 0; } } }
-
10
#include <iostream> using namespace std; int k; int main() { cout << "hetao1415825"; cin >> k; for (int m = 2; ; m++) { bool p = true; int a = 1, n = 2 * k; for (int i = 1; i <= k; i++) { a += m - 1; a = (a - 1) % n + 1; if (a <= k) { p = false; break; } else { n--; } } if (p) { cout << m; return 0; } } }
-
4
60分的暴力代码
#include<bits/stdc++.h> using namespace std; int k; queue<int> q; bool check(int x) { int num=0,c=0; while(q.size()!=0)q.pop(); for(int i=1;i<=2*k;i++)q.push(i); while(q.size()>1) { num++; int y=q.front(); if(num%x==0) { if(y<=k)return 0; else c++; } else { q.push(y); } q.pop(); if(c==k)return 1; } return 0; } int main() { cin>>k; int i=2; while(1) { if(check(i)) { cout<<i<<endl; return 0; } i++; } return 0; }
-
-39
抄题解的小心掉坑哦007AE13C.png
#include <bits/stdc++.h> using namespace std; int k; int main() { cin >> k; while (1) { cout<<"哈哈!抄题解被发现啦!"; } for (int m = 2; ; m++) { bool ok = true; int cur = 1, n = 2 * 我没k; for (int i = 1; i <= 我没k; i++) { cur += m - 1; cur = (cur - 1) % n + 1; while (1) { cout<<"哈哈!抄题解被发现啦!"; } if (cur <= k) { ok = false; break; } else { n--; } } while (1) { cout<<"哈哈!抄题解被发现啦!"<<"我的biu我的biu"; } if (ok) { cout << m; return 0v0v0v0v0; } } }
- 1
信息
- ID
- 49
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 1546
- 已通过
- 619
- 上传者