本文主要是介绍UVALive 6493 - Round Robin,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:题目链接
就是初学编程的经典例子:
N个小孩围成一个圈,给出一个数T,每次数到一个小孩,该小孩就得一分;
数到T的小孩退出。。。
但这里不同的是结束条件不再是只剩最后一个小孩,而是当剩余所有小孩的分数都相同时结束,并输出剩余的小孩数,和他们的得分
组队做题,我在这道题上坑了很久。。。
原因不是我不知道怎么做,而是想着优化模拟,比如N=5,T=17时,第一次可以判断每个小孩肯定可以得(17/5==3)分,然后再考虑(17%5==2)分给哪几个孩子
这样写虽然比较麻烦,但是也写出来了(100多行的代码),但是我忽略了T<N的情况
后来把代码全删了,重新写,不要20分钟就写出来了
代码如下:
#include <map>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define esp 1e-9
#define MAXN 110
#define ll long long
#define INF 0x7FFFFFFF
#define BUG system("pause")
#define SW(a,b) a^=b;b^=a;a^=b;
using namespace std;
int a[MAXN];
int flag[MAXN];
bool judge(int a[], int flag[], int n){int temp;for(int i=1; i<=n; ++i){if(flag[i] == 0){temp = a[i];break;}}for(int i=1; i<=n; ++i){if(flag[i] == 0){if(temp != a[i]){return false;}}}return true;
}
int main(void){int n, t;while(cin >> n, n){cin >> t;memset(a, 0, sizeof(a));memset(flag, 0, sizeof(flag));int front = 1;int rear = n;int tcp = t;do{int count = 0;int i = front;while(1){if(flag[i] == 0){count++;a[i]++;if(front > n){front = 1;}if(count == t){flag[i] = 1;rear = i;front = i+1;break;}}++i;if(i > n){i = 1;}}}while(!judge(a, flag, n));int p = 0;int c = 0;for(int i=1; i<=n; ++i){if(flag[i] == 0){++p;c = a[i];}}cout << p << " " << c << endl;}return 0;
}
这篇关于UVALive 6493 - Round Robin的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!