标签:
各种情况特判,然后枚举前两个点之间的关系
3 6 1 0 1 0 0 0 5 1 1 1 1 1 3 1 2 3
NO YES 0 YES 2 2 1 3 2
/* *********************************************** Author :CKboss Created Time :2015年08月08日 星期六 09时35分46秒 File Name :HDOJ5353.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> using namespace std; typedef long long int LL; const int maxn=100100; int n; int a[maxn],b[maxn],f[maxn]; LL s; void print() { puts("YES"); int cnt=0; for(int i=0;i<n;i++) if(f[i]) cnt++; printf("%d\n",cnt); for(int i=0;i<n;i++) { int nx=i+1; if(nx==n) nx=0; if(f[i]==1) { printf("%d %d\n",i+1,nx+1); } else if(f[i]==-1) { printf("%d %d\n",nx+1,i+1); } } } bool func(int x) { memcpy(b,a,sizeof(a)); memset(f,0,sizeof(f)); f[0]=x; b[0]-=x; b[1]+=x; b[n]=b[0]; for(int i=1;i<n;i++) { if(abs(b[i])>=2) return false; if(b[i]==1) { f[i]=1; b[i]-=1; b[i+1]+=1; } else if(b[i]==-1) { f[i]=-1; b[i]+=1; b[i+1]-=1; } } return true; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T_T; scanf("%d",&T_T); while(T_T--) { scanf("%d",&n); s=0; for(int i=0;i<n;i++) { scanf("%d",a+i); s+=a[i]; } if(s%n!=0) { puts("NO"); continue; } s=s/n; bool fg=true; bool zero=true; for(int i=0;i<n&&fg;i++) { a[i]-=s; if(a[i]!=0) zero=false; if(!(a[i]>=-2&&a[i]<=2)) fg=false; } if(fg==false) { puts("NO"); continue; } if(zero==true) { puts("YES\n0"); continue; } if(func(0)) print(); else if(func(1)) print(); else if(func(-1)) print(); else puts("NO"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/ck_boss/article/details/47362643