题目链接: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;
}