Codeforces 730A:Toda 2(multiset模拟)
http://codeforces.com/problemset/problem/730/A
题意:有n个人打天梯,想让这n个人的分数相同,每场比赛必须有2-5个人参赛,参赛的人会降低一分,问一个合理方案让所有人的分数相同。
思路:不限制比赛场数,那么只用考虑2-3个人参赛的情况(因为4和5可以由2和3组成)。但是这个时候就不知道什么时候用3什么时候用2了。。
看别人代码。只有最大的三个数是一样的时候才用3,其他时候都用2。
然后很暴力地用multiset来模拟比赛。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define N 105 4 struct node { 5 int r, id; 6 friend bool operator < (const node &a, const node &b) { return a.r > b.r; } 7 }; 8 multiset<node> s; 9 vector<string> res; 10 11 int main() { 12 int n, r; 13 scanf("%d", &n); 14 for(int i = 1; i <= n; i++) 15 scanf("%d", &r), s.insert((node) {r, i}); 16 while(s.begin()->r != s.rbegin()->r) { 17 vector<node> tmp; string ans; 18 for(int i = 0; i < n; i++) ans += '0'; 19 int cnt = 2; 20 if(s.count(*s.begin()) == 3) cnt = 3; 21 for(int i = 0; i < cnt; i++) { 22 node now = *s.begin(); s.erase(s.begin()); 23 ans[now.id-1] = '1'; 24 if(now.r > 0) now.r--; 25 tmp.push_back(now); 26 } 27 for(int i = 0; i < cnt; i++) s.insert(tmp[i]); 28 res.push_back(ans); 29 } 30 printf("%d\n%d\n", s.begin()->r, res.size()); 31 for(int i = 0; i < res.size(); i++) cout << res[i] << endl; 32 return 0; 33 }