Codeforces Round #274 B. Towers

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

题意:给你n个数,最多经过k次操作(每次操作对两个数,一个数加1,另一个数减1)问在不超过k次操作的过程中,计算出n个数中最大数与最小数的差值。。。

注意这题是个特判题。。。。


思路:先升序排序,对每次操作,我们对最大和最小的两个数进行操作,操作完后又进行排序。。。如果遇到最大与最小数的差值为0就不需要再进行啦。。。。


code:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>

using namespace std;

struct Node
{
    int d,id;
}a[110];

bool cmp(Node t1,Node t2)
{
    return t1.d<t2.d;
}

int b[1100],c[1100];
int main()
{

    int n,k;
    while(scanf("%d%d",&n,&k)==2)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i].d);
            a[i].id=i;
        }
        sort(a+1,a+n+1,cmp);
        int len=0;
        /*for(int i=1;i<=n;i++)
        {
            printf("%d %d\n",a[i].d,a[i].id);
        }*/
       // printf("\n");
        for(int i=0;i<k;i++)
        {
            if(a[n].d-a[1].d==0) break;
            a[n].d--;
            a[1].d++;
            b[len]=a[n].id;
            c[len++]=a[1].id;
            sort(a+1,a+n+1,cmp);
        }
        int ans=a[n].d-a[1].d;
        printf("%d %d\n",ans,len);
        for(int i=0;i<len;i++)
        {
            printf("%d %d\n",b[i],c[i]);
        }
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值