Problem Description
There are n soda
sitting around a round table. soda are numbered from 1 to n and i-th
soda is adjacent to (i+1)-th
soda, 1-st
soda is adjacent to n-th
soda.



Each soda has some candies in their hand. And they want to make the number of candies the same by doing some taking and giving operations. More specifically, every two adjacent soda x and y can
do one of the following operations only once:

1. x-th
soda gives y-th
soda a candy if he has one;

2. y-th
soda gives x-th
soda a candy if he has one;

3. they just do nothing.



Now you are to determine whether it is possible and give a sequence of operations.
 
Input
There are multiple test cases. The first line of input contains an integer T,
indicating the number of test cases. For each test case:



The first contains an integer n (1≤n≤105),
the number of soda.

The next line contains n integers a1,a2,…,an (0≤ai≤109),
where ai denotes
the candy i-th
soda has.
 
Output
For each test case, output "YES" (without the quotes) if possible, otherwise output "NO" (without the quotes) in the first line. If possible, then the output an integer m(0≤m≤n) in
the second line denoting the number of operations needed. Then each of the following m lines
contain two integers x and y (1≤x,y≤n),
which means that x-th
soda gives y-th
soda a candy.
 
Sample Input
3
6
1 0 1 0 0 0
5
1 1 1 1 1
3
1 2 3
 
Sample Output
NO
YES
0
YES
2
2 1 3 2 题意:n个人均分蛋糕。刚開始每人都有a[i]块蛋糕。每一个人有一次机会能把自己的一个苹果传给左边的人或者右边的人(注意是环状的)。问能不能使最后每一个人的蛋糕数都同样。 思路:先看总和能不能被n均分,不能均分就输出NO,假设能均分。算出平均值ave,把每一个a[i]变为a[i]-ave,假设a[i]的平均值大于等于3就输出NO,假设是2或者-2,就把它拆成两个1或者两个-1. 上面处理完后。就先找到第一个1的位置(假设找不到。说明都是0,直接输出YES),然后对于这个1。他仅仅能分给右边的-1或者左边的-1,并且在遇到-1前不能再遇到1(能够画一下),当它走到原位置的时候。代表可行,假设中途就不可行就输出NO。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
#define maxn 100050
#define ll long long
struct node{
int idx,num;
}b[2*maxn];
struct edge{
int l,r;
}c[2*maxn]; int vis[2*maxn],tot,m;
ll a[2*maxn];
void daying(int st,int ed,int f)
{
int i,j,k;
if(f==2){
if(st<ed){
for(k=st;k<ed;k++){
tot++;c[tot].l=b[k].idx;c[tot].r=b[k+1].idx;
}
}
else{
for(k=st;k<=m-1;k++){
tot++;c[tot].l=b[k].idx;c[tot].r=b[k+1].idx;
}
tot++;c[tot].l=b[m].idx;c[tot].r=b[1].idx;
for(k=1;k<ed;k++){
tot++;c[tot].l=b[k].idx;c[tot].r=b[k+1].idx;
}
}
}
else if(f==1){
if(st>ed){
for(k=st;k>ed;k--){
tot++;c[tot].l=b[k].idx;c[tot].r=b[k-1].idx;
}
}
else{
for(k=st;k>=2;k--){
tot++;c[tot].l=b[k].idx;c[tot].r=b[k-1].idx;
}
tot++;c[tot].l=b[1].idx;c[tot].r=b[m].idx;
for(k=m;k>ed;k--){
tot++;c[tot].l=b[k].idx;c[tot].r=b[k-1].idx;
}
}
}
} int main()
{
int i,j,T,flag,num,st,p,kaishi;
ll sum,ave,n;
scanf("%d",&T);
while(T--)
{
sum=0;
scanf("%lld",&n);
for(i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum+=a[i];
}
if(sum%n!=0){
printf("NO\n");continue;
}
ave=sum/n;flag=1;
m=0;
for(i=1;i<=n;i++){
a[i]=a[i]-ave;
if(abs(a[i])>=3){
flag=0;break;
}
if(a[i]==1 || a[i]==0 || a[i]==-1){
m++;b[m].idx=i;b[m].num=a[i];
}
else{
m++;b[m].idx=i;b[m].num=a[i]/2;
m++;b[m].idx=i;b[m].num=a[i]/2;
}
}
if(flag==0){
printf("NO\n");continue;
}
kaishi=0;
for(i=1;i<=m;i++){
if(b[i].num==1){
kaishi=i;break;
}
}
if(kaishi==0){
printf("YES\n");
printf("0\n");continue;
}
tot=0;
memset(vis,0,sizeof(vis));
num=1;p=st=kaishi;vis[kaishi]=1;
flag=1;
while(1) //往右方向找
{
if(p==m){
p=1;
}
else p++;
if(vis[p]==1)break;
vis[p]=1;
if(b[p].num==0){
continue;
}
if(num==0){
st=p;
num+=b[p].num;
continue;
} num+=b[p].num;
if(abs(num)>=2){
flag=0;break;
}
if(b[p].num==1){
daying(p,st,1);
}
else{
daying(st,p,2);
}
//st=p;
}
if(flag){
printf("YES\n");
printf("%d\n",tot);
for(i=1;i<=tot;i++){
printf("%d %d\n",c[i].l,c[i].r);
}
continue;
} tot=0;
memset(vis,0,sizeof(vis));
num=1;p=st=kaishi;vis[kaishi]=1;
flag=1;
while(1) //忘左方向找
{
if(p==1){
p=m;
}
else p--;
if(vis[p]==1)break;
vis[p]=1;
if(b[p].num==0){
continue;
}
if(num==0){
st=p;
num+=b[p].num;
continue;
} num+=b[p].num;
if(abs(num)>=2){
flag=0;break;
}
if(b[p].num==1){
daying(p,st,2);
}
else{
daying(st,p,1);
}
}
if(flag){
printf("YES\n");
printf("%d\n",tot);
for(i=1;i<=tot;i++){
printf("%d %d\n",c[i].l,c[i].r);
}
continue;
}
printf("NO\n");
}
return 0;
}
/*
100
11
1 -1 1 1 -1 0 1 -1 -1 1 -1
*/

hdu5353 Average的更多相关文章

  1. hdu5353 Average(模拟)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Average Time Limit: 4000/2000 MS (Java/Ot ...

  2. training 2

    Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.136 Average Precision (AP) @[ IoU ...

  3. [LeetCode] Moving Average from Data Stream 从数据流中移动平均值

    Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...

  4. Average Precision of VOC

    转一篇文章,主要是关于VOC中Average Precision指标的 原文出处:https://sanchom.wordpress.com/tag/average-precision/ 还有一篇文章 ...

  5. Moving Average from Data Stream

    Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...

  6. average slice

    A non-empty zero-indexed array A consisting of N integers is given. A pair of integers (P, Q), such ...

  7. LeetCode Moving Average from Data Stream

    原题链接在这里:https://leetcode.com/problems/moving-average-from-data-stream/ 题目: Given a stream of integer ...

  8. Linq查询操作之聚合操作(count,max,min,sum,average,aggregate,longcount)

    在Linq中有一些这样的操作,根据集合计算某一单一值,比如集合的最大值,最小值,平均值等等.Linq中包含7种操作,这7种操作被称作聚合操作. 1.Count操作,计算序列中元素的个数,或者计算满足一 ...

  9. Load Average

    在Linux系统下面,有很多的命令可以查看系统的负载情况:比如top,uptime,w,示例如下: [wenchao.ren@l-cmsweb1.ops.cn1 ~]$ w 18:39:10 up 7 ...

随机推荐

  1. WebGL学习(1) - 三角形

    原文地址:WebGL学习(1) - 三角形 还记得第一次看到canvas的粒子特效的时候,真的把我给惊艳到了,原来在浏览器也能做出这么棒的效果.结合<HTML5 Canvas核心技术>和网 ...

  2. 转:ef获取某个表中的部分字段值

    我有个新闻表 id,title,body,createtime,author,click 使用ef4.1 仅仅读取 id,title,createtime 并显示在页面上. public static ...

  3. 【ThinkPHP框架学习 】(2) --- 后台管理系统如何用iframe点击左边右边局部刷新

    如题:         在写后台管理系统时,需要实现后台界面的局部动态刷新.         左边的导航栏使用a标签进行设置,通过href和target属性的配合,就可以将iframe中的子页实现动态 ...

  4. Filezilla账号密码都正确,但是连不上

    显示的错误信息是:服务器发回了不可路由的地址.使用服务器地址代替. 之前一直用CuteFTP把ssm项目发送给客户服务器,最近学习大数据用Filezilla连通虚拟机,感觉Filezilla很直观.就 ...

  5. apply和call的区别

    每一个javascript中的Function对象都有一个apply()方法和call()方法,他们的基本用法为: /*apply()方法*/ function.apply(thisObj[, arg ...

  6. 新一代的昆明网络seo优化技巧

    一年一度的双11又即将到来,今天选择在双11这天新注册了一个博客园,第一篇文章,我决定来谈一谈现在的网络SEO. 起首咱们来熟悉下SEO是什么,SEO全名叫Search Engine Optimiza ...

  7. python量化之路:获取历史某一时刻沪深上市公司股票代码及上市时间

    最近开始玩股票量化,由于想要做完整的股票回测,因此股票的上市和退市信息就必不可少.因为我们回测的时候必须要知道某一日期沪深股票的成分包含哪些对吧.所以我们要把沪深全部股票的上市时间.退市时间全部都爬下 ...

  8. c#基础知识索引器

    代码 ]);    }} 在这里我们看到,无非是实现了一个泛型算法 等同于 Ontology List<string> lit=new List<string>(); lis. ...

  9. 转-Gitorious搭建步骤

    先标记一下,后续手动验证 http://blog.csdn.net/king_sundi/article/details/7457475 安装Gitorious Git是一个分布式的版本控制系统,用于 ...

  10. 31.Linux-wm9876声卡驱动(移植+测试)

    本节学习目的 1)分析Linux中的OSS声卡系统 2)移植wm9876声卡 3)使用madplay应用程序播放mp3 1.声音三要素 采样频率 音频采样率是指录音设备在一秒钟内对声音信号的采样次数, ...