codeforces C. New Year Ratings Change 解题报告
题目链接:http://codeforces.com/problemset/problem/379/C
题目意思:有n个users,每个user都有自己想升的rating。要解决的问题是给予每个人不同的rating,使得每个人rating不比他期望的rating小,即 安排的rating >= 他自己的希望的rating,还有一个条件就是 总rating之和要最小。
要想使得总rating最少,那么安排的rating要尽可能小。把rating从小到大排序。对最小的rating值当然就给予这个值,于是下一次安排的rating在这个值的基础下递增1(rmin+1),当下一个user期望的rating和这个值相同时,就把rmin+1分配给他,接着下一次安排的最小rating是rmin+2。当遇到期望的rating比这个安排的rating要大时,安排的rating恰好可以安排他所期望的,而下一次安排的rating的值是 他自己希望的rating+1
由于要按顺序把这些rating输出,还要附加一个id值表明这些user初始的位置。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 const int maxn = 3*1e5 + 5; 9 10 struct ratings 11 { 12 int id; 13 int ra; 14 int ans; 15 } exp[maxn]; 16 17 int cmpid(ratings x, ratings y) 18 { 19 return x.id < y.id; // id从小到大排序 20 } 21 22 int cmpra(ratings x, ratings y) 23 { 24 return x.ra < y.ra; // ra从小到大排序 25 } 26 27 int main() 28 { 29 int i, n; 30 while (scanf("%d", &n) != EOF) 31 { 32 for (i = 1; i <= n; i++) 33 { 34 scanf("%d", &exp[i].ra); 35 exp[i].id = i; 36 } 37 sort(exp+1, exp+n+1, cmpra); 38 int cur = exp[1].ra; 39 for (i = 1; i <= n; i++) 40 { 41 if (exp[i].ra <= cur) 42 { 43 exp[i].ans = cur; 44 cur++; 45 } 46 else 47 { 48 exp[i].ans = exp[i].ra; 49 cur = exp[i].ra + 1; 50 } 51 } 52 sort(exp+1, exp+n+1, cmpid); 53 for (i = 1; i < n; i++) 54 printf("%d ", exp[i].ans); 55 printf("%d\n", exp[i].ans); 56 } 57 return 0; 58 }
参考人家写的,pair原来这么强大的!!! ^_^
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 #define f first 9 #define s second 10 #define max(a, b) ((a) > (b) ? (a) : (b)) 11 12 const int maxn = 3*1e5 + 5; 13 pair<int, int> p[maxn]; 14 int ans[maxn]; 15 16 int main() 17 { 18 int i, n, cur; 19 while (scanf("%d", &n) != EOF) 20 { 21 for (i = 1; i <= n; i++) 22 { 23 scanf("%d", &p[i].f); 24 p[i].s = i; 25 } 26 sort(p+1, p+n+1); 27 cur = 0; 28 for (i = 1; i <= n; i++) 29 { 30 cur = max(p[i].f, cur+1); 31 ans[p[i].s] = cur; 32 } 33 for (i = 1; i < n; i++) 34 printf("%d ", ans[i]); 35 printf("%d\n", ans[i]); 36 } 37 return 0; 38 }