• codeforces 479B Towers 解题报告


    题目链接:http://codeforces.com/problemset/problem/479/B

    题目意思:有 n 座塔,第 i 座塔有 ai 个cubes在上面。规定每一次操作是从最多 cubes 的塔中取走一个cube,加去拥有最少 cubes 的塔上,那么显然,本来是最多cubes的塔的 cubes 数目会减少1,而拥有最少的 cubes 的塔的cubes数增加 1 。现在最多操作 k 次,使得最多 cubes 数 的塔的cubes数 减去 最少cubes数的塔的cubes 数最少(即题目中的instability)。输出总共执行的次数和具体的移动方案(i j:表示将第 i 个塔的一个cube 加到 第 j 座塔上)

         这道题其实很简单,比赛的时候想复杂了,以为需要一个 pre 记录前一次最多cubes - 最少cubes 的数目,于是死改~~~死改~~~~越改越复杂~~~~最终就呵呵啦。

         可以这样想,对于每一次移动,我们当然是按题目要求来做:最多cubes - 最少cubes,然后将相应编号的 tower 的 cubes 数作相应的改动(分别为-1,+1),然后再排序,再这样处理。关键是知道什么时候结束!!!就是最多cubes - 最少cubes == 0 的时候。除了这种情况,我们都执行 k 次,因为题目中并没有限制执行次数尽量少,而只是希望instability尽量少而已。那么即使有些情况重复执行也是不影响最终结果的!!

         还有一个特判就是如果刚开始的时候最多cubes - 最少cubes == 0了,我们就不需要作任何操作,直接输出0 0 即可。

       

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int maxn = 100 + 10;
     9 const int N = 1000 + 5;
    10 #define f first
    11 #define s second
    12 
    13 pair<int, int> p[maxn];
    14 int ans[N][2];
    15 
    16 int main()
    17 {
    18     int n, k;
    19     while (scanf("%d%d", &n, &k) != EOF)
    20     {
    21         for (int i = 1; i <= n; i++)
    22         {
    23             scanf("%d", &p[i].f);
    24             p[i].s = i;
    25         }
    26         sort(p+1, p+1+n);
    27         if (p[n].f == p[1].f)
    28             printf("0 0
    ");
    29         else
    30         {
    31             int cnt = 0;
    32             for (int l = 0; l < k; l++)
    33             {
    34                 ans[cnt][0] = p[n].s;      // 记录编号
    35                 ans[cnt++][1] = p[1].s;
    36                 p[n].f--;
    37                 p[1].f++;
    38                 sort(p+1, p+1+n);
    39                 if (p[n].f == p[1].f)      // 最多cubes == 最少cubes
    40                     break;
    41             }
    42             printf("%d %d
    ", p[n].f - p[1].f, cnt);
    43             for (int i = 0; i < cnt; i++)
    44                 printf("%d %d
    ", ans[i][0], ans[i][1]);
    45         }
    46     }
    47     return 0;
    48 }

      

  • 相关阅读:
    php——验证身份证是否合法的函数
    php——离线执行任务
    代码整洁之道
    js自适应屏幕高度
    SSH Junit4测试
    Java Persistence with Hibernate
    SSH搭建
    js整理
    Hibernate 应用
    对学习的一点感想
  • 原文地址:https://www.cnblogs.com/windysai/p/4036272.html
Copyright © 2020-2023  润新知