hdu5353 Average
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.
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.
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.
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 题意: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的更多相关文章
- hdu5353 Average(模拟)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Average Time Limit: 4000/2000 MS (Java/Ot ...
- training 2
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.136 Average Precision (AP) @[ IoU ...
- [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 ...
- Average Precision of VOC
转一篇文章,主要是关于VOC中Average Precision指标的 原文出处:https://sanchom.wordpress.com/tag/average-precision/ 还有一篇文章 ...
- Moving Average from Data Stream
Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...
- average slice
A non-empty zero-indexed array A consisting of N integers is given. A pair of integers (P, Q), such ...
- LeetCode Moving Average from Data Stream
原题链接在这里:https://leetcode.com/problems/moving-average-from-data-stream/ 题目: Given a stream of integer ...
- Linq查询操作之聚合操作(count,max,min,sum,average,aggregate,longcount)
在Linq中有一些这样的操作,根据集合计算某一单一值,比如集合的最大值,最小值,平均值等等.Linq中包含7种操作,这7种操作被称作聚合操作. 1.Count操作,计算序列中元素的个数,或者计算满足一 ...
- Load Average
在Linux系统下面,有很多的命令可以查看系统的负载情况:比如top,uptime,w,示例如下: [wenchao.ren@l-cmsweb1.ops.cn1 ~]$ w 18:39:10 up 7 ...
随机推荐
- Flex布局(引用阮一峰大神)
Flex 布局教程:语法篇 http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html Flex 布局教程:实例篇 http://www.ruan ...
- java_IO流读取本地文件
package com.ht.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoun ...
- keras 修仙笔记一
对于牛逼的程序员,人家都喜欢叫他大神:因为大神很牛逼,人家需要一个小时完成的技术问题,他就20分钟就搞定.Keras框架是一个高度集成的框架,学好它,就犹如掌握一个法宝,可以呼风唤雨.所以学keras ...
- HBuilder入门(构建h5+APP)
if(window.plus) { plusReady(); } else { //plusready事件(自带事件)调用了才可使用h5+API document.addEventListener(& ...
- nodejs+mongoose+websocket搭建xxx聊天室
简介 本文是由nodejs+mongoose+websocket打造的一个即时聊天系统:本来打算开发一个类似于网页QQ类似功能的聊天系统,但是目前只是开发了一个模块功能 --- 类似群聊的,即一对多的 ...
- 十二、Hadoop学习笔记————Hive的基本原理
一般用户用CLI(命令行界面)接口,元数据库含有表结构 单用户.多用户.远程服务 生成db文件,只能单客户端使用数据库 多用户是最常用的使用模式 配置与多用户一致 数据格式用户自定义 所有的表都存于改 ...
- C语言之循环计数
#include<stdio.h>int main(){int num,count=0,i=0;scanf("%d",&num);num/=10;count++ ...
- ptrdiff_t 和 size_t
size_t和ptrdiff_t常常用来指示数组长度. size_t常用于表示数组的大小,可以一般的将他看为 typedef unsigned int size_t,实质是一个无符号整形.包含在头文件 ...
- ##6.1 Neutron控制节点-- openstack pike
##6.1 Neutron控制节点 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##6.1 Neutron控制节 ...
- 对jQuery源码的一点感悟
1. 链式写法 这是jQuery语法上的最大特色,也许该改改POJO里的set方法,和其他的非get方法什么的,可以把多行代码合并,减去每次敲打对象变量的麻烦 2. 动态参数 偶尔使用Java的动 ...