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 ...
 
随机推荐
- NoSQL:redis缓存数据库
			
一 Redis介绍 Redis和Memcached类似,也属于key-value nosql 数据库 Redis官网redis.io, 当前最新稳定版4.0.1 和Memcached类似,它支持存储的 ...
 - C#多功能DataGridView打印类(WinForm)
			
; printPreviewDialog.ShowDialog(); } catch { ...
 - java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)
			
线程同步辅助类,主要学习两点: 1.上述几种同步辅助类的作用以及常用的方法 2.适用场景,如果有适当的场景可以用到,那无疑是最好的 semaphore(seməˌfôr) 含义 信号量就是可以声明多把 ...
 - java并发之线程执行器(Executor)
			
线程执行器和不使用线程执行器的对比(优缺点) 1.线程执行器分离了任务的创建和执行,通过使用执行器,只需要实现Runnable接口的对象,然后把这些对象发送给执行器即可. 2.使用线程池来提高程序的性 ...
 - [最短路][部分转]P1027 Car的旅行路线
			
题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位 ...
 - 为什么ERP行业发展缓慢规模难扩大?
			
题记:这个行业只会越来越好,但是能沉淀下来做事儿的企业越来越少,因为收益真的很漫长:能够真正进入这个行业难,出去也难... 经常在知乎上看到类似的问题:既然所有ERP系统都很烂,那有没有创业公司的空间 ...
 - 《java.util.concurrent 包源码阅读》16 一种特别的BlockingQueue:SynchronousQueue
			
SynchronousQueue是一种很特别的BlockingQueue,任何一个添加元素的操作都必须等到另外一个线程拿走元素才会结束.也就是SynchronousQueue本身不会存储任何元素,相当 ...
 - 从MVC到Ajax再到前后端分离的思考
			
前言 一位小妹去面试前端,前端leader问了"什么是ajax?",答:"接收后台的数据,然后然后自己填充和渲染样式":一位小哥去面试后台,技术经理问了&quo ...
 - BST 解析 (二)height and deletion
			
前面一章介绍了BST的结构和一些简单的基本功能,例如:insert,findMin,nextLarger等等.这一节主要讲解一些BST的delete node操作还有BST的height的分析以及一些 ...
 - 基于 HTML5 Canvas 的简易 2D 3D 编辑器
			
不管在任何领域,只要能让非程序员能通过拖拽来实现 2D 和 3D 的设计图就是很牛的,今天我们不需要 3dMaxs 等设计软件,直接用 HT 就能自己写出一个 2D 3D 编辑器,实现这个功能我觉得成 ...