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. weiapi 获取项目根目录

    无法使用: Server.Map("~"); Server.Map("~/"); Server.Map("./"); Server.Map( ...

  2. Python学习——列表

    定义:1.列表(list)是由一系列特定顺序排列的元素组成,可以包含字母,数字或者将任何东西加入列表. 2.列表的标识符号为 [ ],函数名称为list 3.列表是有序的 相关概念: 元素:列表中的值 ...

  3. GCC 中的编译器堆栈保护技术

    GCC 中的编译器堆栈保护技术 前几天看到的觉得不错得博客于是转发了,但这里我补充一下一些点. GCC通过栈保护选项-fstack-protector-all编译时额外添加两个符号,__stack_c ...

  4. Linux系列教程(二十一)——Linux的bash基本功能

    上篇博客我们介绍了什么是shell,以及编写shell脚本的两种执行方式.我们知道在敲命令的时候,有很多快捷键,比如tab键能补全命令,在比如为什么我们直接敲 ll 命令能显示目录的长格式,其实这是b ...

  5. fragmentTabHost 使用示例

    目前我们看微信的底部,有四个导航栏,那我们应该来怎么实现类似的导航栏呢? 在 android 4.0 的时候,推出了一个新的工具,fragmentTabHost . fragmentTabHost  ...

  6. openstack安装在虚拟机上重启之后无法启动问题

    http://www.byywee.com/page/M0/S931/931767.html 运行rejoin-stack.sh脚本的核心: exec screen -c $TOP_DIR/stack ...

  7. RabbitMQ之发布订阅

    工作队列中,每个任务之分发给一个工作者.如果需要分发一个消息给多个消费者,这种模式被称为“发布/订阅” 交换器(Exchanges) RabbitMQ完整的消息模型 发布者(producer)是发布消 ...

  8. DNS生效时间

    http://blog.itechol.com/space-33-do-blog-id-908.html http://www.madboa.com/geek/dig/ Dig简介 Dig是一个在类U ...

  9. 用python画一朵玫瑰花

    废话不多说,直接上代码 from turtle import * import time setup(600,800,0,0) speed(0) penup() seth(90) fd(340) se ...

  10. jq实现全选或者全不选

    $("#all").click(function () { if($(this).is(":checked")){ $("input[name='pr ...