• 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 ms 3500 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
    ", exp[i].ans);
    56     }
    57     return 0;
    58 }

          参考人家写的,pair原来这么强大的!!! ^_^

        

    Time

    Memory

    171 ms 3500 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
    ", ans[i]);
    36     }
    37     return 0;
    38 }

        

  • 相关阅读:
    DateTime.Now的精度这么高! (转)
    RC4经典加密算法VB版本代码
    反拍卖采购技术的应用
    用C#写 四舍五入函数(函数版)
    CRM(客户关系管理)
    给按钮增加属性
    用C#写 四舍五入函数(原理版)
    合并datagrid中内容相同的单元格(VB.Net)
    DataGrid删除确认及Item颜色交替
    得到目录大小
  • 原文地址:https://www.cnblogs.com/windysai/p/3544473.html
Copyright © 2020-2023  润新知