1001,纪念一下300多行的代码 ,今天的前一个小时做了这么一道题
可读性基本没有,太长了,说下思路吧
首先看糖的总数是否能被n整除,不能的话输出“NO”
接下来就是突破点:
1,每个人最多能进行两次操作,所以如果有一个人的糖果数比ave(平均数)多2以上或者ave比这个人的糖果数多2以上,直接输出“NO”
2,找到一个a[i](第i个人的糖果数),如果a[i]==ave+2 or a[i]=ave-2,那么可以将i的这个位置作为突破口向两边遍历找出结果
3,如果在忽略所有a[i]==ave的人的情况向如果有相邻的两个人的糖果数相等,且与ave的值差为1的话,那么可以直接一当前的两个相邻位置向两侧遍历找出结果
4,如果以上情况都没有发生,可以直接从a[1]的位置直接遍历那么得到的结果即为所求
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#define ll __int64
#define INF 1e9
#define maxn 100005
using namespace std;
ll a[maxn];
int n;
ll ave;
struct node{
int a,b;
}p[maxn];
int fun1(int pos){
if(n<3) return -1;
int A=0;
if(pos==1){
a[n]--;
a[pos+1]--;
a[pos]+=2;
p[A].a=n;
p[A++].b=pos;
p[A].a=pos+1;
p[A++].b=pos;
}
else if(pos==n){
a[1]--;
a[pos-1]--;
a[pos]+=2;
p[A].a=1;
p[A++].b=pos;
p[A].a=pos-1;
p[A++].b=pos;
}
else{
a[pos+1]--;
a[pos-1]--;
a[pos]+=2;
p[A].a=pos+1;
p[A++].b=pos;
p[A].a=pos-1;
p[A++].b=pos;
}
for(int i=pos+1;i<n;i++){
if(a[i]==ave) continue;
if(a[i]==ave+1){
p[A].a=i;
p[A++].b=i+1;
a[i+1]++;
a[i]--;
}
else if(a[i]==ave-1){
p[A].a=i+1;
p[A++].b=i;
a[i+1]--;
a[i]++;
}
else return -1;
}
for(int i=pos-1;i>1;i--){
if(a[i]==ave) continue;
if(a[i]==ave+1){
p[A].a=i;
p[A++].b=i-1;
a[i-1]++;
a[i]--;
}
else if(a[i]==ave-1){
p[A].a=i-1;
p[A++].b=i;
a[i-1]--;
a[i]++;
}
else return -1;
}
if(a[1]>a[n]){
p[A].a=1;
a[1]--;
p[A++].b=n;
a[n]++;
}
if(a[1]<a[n]){
p[A].a=n;
a[n]--;
p[A++].b=1;
a[1]++;
}
return A;
}
int fun2(int pos){
if(n<3) return -1;
int A=0;
if(pos==1){
a[n]++;
a[pos+1]++;
a[pos]-=2;
p[A].a=pos;
p[A++].b=n;
p[A].a=pos;
p[A++].b=pos+1;
}
else if(pos==n){
a[1]++;
a[pos-1]++;
a[pos]-=2;
p[A].a=pos;
p[A++].b=1;
p[A].a=pos;
p[A++].b=pos-1;
}
else{
a[pos+1]++;
a[pos-1]++;
a[pos]-=2;
p[A].a=pos;
p[A++].b=pos+1;
p[A].a=pos;
p[A++].b=pos-1;
}
for(int i=pos+1;i<n;i++){
if(a[i]==ave) continue;
if(a[i]==ave+1){
p[A].a=i;
p[A++].b=i+1;
a[i+1]++;
a[i]--;
}
else if(a[i]==ave-1){
p[A].a=i+1;
p[A++].b=i;
a[i+1]--;
a[i]++;
}
else return -1;
}
for(int i=pos-1;i>1;i--){
if(a[i]==ave) continue;
if(a[i]==ave+1){
p[A].a=i;
p[A++].b=i-1;
a[i-1]++;
a[i]--;
}
else if(a[i]==ave-1){
p[A].a=i-1;
p[A++].b=i;
a[i-1]--;
a[i]++;
}
else return -1;
}
if(a[1]>a[n]){
p[A].a=1;
a[1]--;
p[A++].b=n;
a[n]++;
}
if(a[1]<a[n]){
p[A].a=n;
a[n]--;
p[A++].b=1;
a[1]++;
}
return A;
}
int fun3(int pos){
int A=0;
for(int i=pos+1;i<n;i++){
if(a[i]==ave) continue;
if(a[i]==ave+1){
p[A].a=i;
p[A++].b=i+1;
a[i]--;
a[i+1]++;
}
else if(a[i]==ave-1){
p[A].a=i+1;
p[A++].b=i;
a[i]++;
a[i+1]--;
}
else return -1;
}
for(int i=pos;i>1;i--){
if(a[i]==ave) continue;
if(a[i]==ave+1){
p[A].a=i;
p[A++].b=i-1;
a[i-1]++;
a[i]--;
}
else if(a[i]==ave-1){
p[A].a=i-1;
p[A++].b=i;
a[i-1]--;
a[i]++;
}
else return -1;
}
if(a[1]>a[n]){
p[A].a=1;
a[1]--;
p[A++].b=n;
a[n]++;
}
if(a[1]<a[n]){
p[A].a=n;
a[n]--;
p[A++].b=1;
a[1]++;
}
return A;
}
int fun(){
int A=0;
for(int i=2;i<n;i++){
if(a[i]==ave) continue;
if(a[i]==ave+1){
p[A].a=i;
p[A++].b=i+1;
a[i+1]++;
a[i]--;
}
else if(a[i]==ave-1){
p[A].a=i+1;
p[A++].b=i;
a[i+1]--;
a[i]++;
}
else return -1;
}
if(a[1]>a[n]){
p[A].a=1;
a[1]--;
p[A++].b=n;
a[n]++;
}
if(a[1]<a[n]){
p[A].a=n;
a[n]--;
p[A++].b=1;
a[1]++;
}
return A;
}
void out(int m){
printf("YES\n%d\n",m);
for(int i=0;i<m;i++)
printf("%d %d\n",p[i].a,p[i].b);
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
ll sum=0;
for(int i=1;i<=n;i++){
scanf("%I64d",&a[i]);
sum+=a[i];
}
ll p1=-1,p2=-1,p3=-1,p4=-1,t=0;
if(sum%n==0){
ave=sum/n;
int flag=0;
for(int i=1;!flag&&i<=n;i++){
if(a[i]<ave-2||a[i]>ave+2) flag=1;
if(a[i]==ave-2) p1=i;
if(a[i]==ave+2) p2=i;
if(i&&a[i]==a[i-1-t]&&a[i]==ave-1) p3=i-1-t;
if(i&&a[i]==a[i-1-t]&&a[i]==ave+1) p4=i-1-t;
if(a[i]==ave) t++;
else t=0;
}
int pos1=0,pos2=0;
for(int i=1;i<=n;i++) if(a[i]!=ave) pos1=i;
for(int i=n;i>=1;i--) if(a[i]!=ave) pos2=i;
if(pos1&&pos1==pos2) flag=1;
if(pos1&&a[pos1]==a[pos2]) p3=pos1;
if(flag) printf("NO\n");
else{
int m;
if(p1!=-1) m=fun1(p1);
else if(p2!=-1) m=fun2(p2);
else if(p3!=-1) m=fun3(p3);
else if(p4!=-1) m=fun3(p4);
else m=fun();
for(int i=1;i<=n;i++) if(a[i]!=ave) m=-1;
if(m==-1) printf("NO\n");
else
out(m);
}
}
else
printf("NO\n");
}
return 0;
}