zoukankan      html  css  js  c++  java
  • 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 }

      

  • 相关阅读:
    DataAnnotations
    使用BizTalk实现RosettaNet B2B So Easy
    biztalk rosettanet 自定义 pip code
    Debatching(Splitting) XML Message in Orchestration using DefaultPipeline
    Modifying namespace in XML document programmatically
    IIS各个版本中你需要知道的那些事儿
    关于IHttpModule的相关知识总结
    开发设计的一些思想总结
    《ASP.NET SignalR系列》第五课 在MVC中使用SignalR
    《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)
  • 原文地址:https://www.cnblogs.com/windysai/p/4036272.html
Copyright © 2011-2022 走看看