标签:
各种情况特判,然后枚举前两个点之间的关系
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