洛谷 P1145 约瑟夫 (尚贤)

题目: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;
}
发布了33 篇原创文章 · 获赞 0 · 访问量 167

猜你喜欢

转载自blog.csdn.net/weixin_42790071/article/details/105475194
今日推荐