题目:https://www.luogu.com.cn/problem/P1145
嘿嘿,一看就知道可以暴力
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 0x3f3f3f3f
#define BIG_INF 0x7fffffff
#define min(a, b) ((a < b) ? a : b)
#define max(a, b) ((a > b) ? a : b)
#define SIZE (int)15 + 10
#define Cint const int
using namespace std;
bool a[SIZE];
int main() {
freopen("cpp.in", "r", stdin);
freopen("cpp.out", "w", stdout);
int k;
scanf("%d", &k);
int m = k;
bool ok = true;
while (ok) {
++m;
int t = 0; //位置
a[t] = true;
memset(a, 0, sizeof(a));
for (int i = 1; i <= k; ++i) {
int j = 1;
while (a[t] || j <= m) {
++t;
if (t > 2 * k) {
t = 1;
}
if (!a[t]) {
++j;
}
}
a[t] = true;
if (t <= k) {
break;
}
if (i == k) {
ok = false;
}
}
}
printf("%d\n", m);
return 0;
}
可是,70分…
正解(摘自洛谷题解):
#include<bits/stdc++.h>
using namespace std;
int k,i,sum=0,num=0;
//sum代表被淘汰的人的个数,num代表被淘汰的人的位置
vector <int> a;
bool tle(int i,int sum,int num){
if(sum==k) //当淘汰了k个人的时候
return true;
if(a[(num-1+i)%(2*k-sum)]==1)
return false;
/*这里讲一下:
比如说 k=3 答案是5,队列为
1 1 1 0 0 0
1 2 3 4 5 6
(1是好人,0是坏人,下面的数字是位置)
淘汰第一个人后,队列为
1 1 1 0 0
1 2 3 4 6
^(num的实际位置)
这个位置是空的,我们只能先-1作为num的临时位置再加上i,
相当于num退回了一个位置再走i步。
2*k-sum表示总人数-淘汰过的人数
*/
if(a[(num+i-1)%(2*k-sum)]==0){
a.pop_back(); // 删除a的最后一个元素,因为坏人都是0,删除哪个都无所谓
return tle(i,sum+1,(num+i-1)%(2*k-sum));
}
}
int main(){
freopen("cpp.in", "r", stdin);
freopen("cpp.out", "w", stdout);
ios::sync_with_stdio(false); // 快读
cin >> k;
for(i=1;i<=2*k;i++){
if(i<=k)
a.push_back(1);
else
a.push_back(0);
}
for(i=k+1;;i++){
if(tle(i,0,0)){
cout << i ;
break;
}
}
return 0;
}
我的AC代码(跟上面差不太多):
#include <iostream>
#include <cstdio>
#define F(i, n, m) for (int i = n; i <= m; ++i)
#define UF(i, n, m) for (int i = n; i >= m; --i)
#define INF 0x3f3f3f3f
#define BIG_INF 0x7fffffff
#define min(a, b) ((a < b) ? a : b)
#define max(a, b) ((a > b) ? a : b)
#define SIZE (int)1
#define Cinf const int
using namespace std;
int main() {
freopen("cpp.in", "r", stdin);
freopen("cpp.out", "w", stdout);
int k;
scanf("%d", &k);
int m = k;
bool ok = true;
while (ok) {
++m;
int t = 0;
for (int i = 0; i < k; ++i) {
t = (t + m - 1) % (2 * k - i);
if (t < k) {
break;
}
if (i == k - 1) {
ok = false;
}
}
}
printf("%d\n", m);
return 0;
}