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初始的位置。

     

TimeMemory
717 ms3500 KB

 

 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原来这么强大的!!! ^_^

    

Time

Memory

171 ms3500 KB
 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 }

 

 

    

转载于:https://www.cnblogs.com/windysai/p/3544473.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值