模拟,,,

每个人有一些糖果,每两个人之间只能给一个糖果,问最后是否能让所有人的糖果数量相同,只要确定一个糖果的流向其他的就能够确定。

马虎了,卡了好几天,心塞塞的。。。

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std; const int maxa = ;
int biaoji[maxa];
int vis[maxa];
int put[maxa][];
int ans(int a[], int n){
int sta;
int o = ;
for(int i =;i < n; i++){
if(a[i] > ){
sta = i;
break;
}
}
memset(vis, , sizeof(vis));
int len = ;
int last = ;
for(int k = sta;; k++){
if(len++ > n*) break;
int i = k % n;
if(vis[i] == ){
last = ;
continue;
}
if(last == && a[i] == ){
last = ;
continue;
}
if(a[i] > ){
last = ;
put[o][] = i;
put[o++][] = (i+)%n;
vis[i] = ;
a[i] --, a[(i+)%n] ++;
}else if(a[i] < ) last = ;
}
/*for(int i =0 ;i < n; i++){
printf("%d ", a[i]);
}puts("");*/
len = ;
last = ;
for(int i = sta; ; i--){
i = (i%n+n*)%n;
if(len++ > n*) break;
if(vis[(i+n-)%n] == )continue;
if(a[i] > ){
put[o][] = i;
put[o++][] = (i+n-)%n;
vis[(i+n-)%n] = ;
a[i] --;
a[(i-+n)%n] ++;
}
}
for(int i = ;i < n; i++){
if(a[i] != ) return ;
}
puts("YES");
printf("%d\n", o);
for(int i = ;i < o; i++){
printf("%d %d\n", put[i][]+, put[i][]+);
}return ;
}
int ans1(int a[], int n){
int sta;
int o = ;
for(int i =;i < n; i++){
if(a[i] > ){
sta = i;
break;
}
}
memset(vis, , sizeof(vis));
int len = ;
int last = ; for(int i = sta; ; i--){
i = (i%n+n)%n;
if(last == && a[i] == ){
last = ;
continue;
} if(len++ > n*) break;
if(vis[(i+n-)%n] == ){
last = ;
continue;
}
if(a[i] > ){
put[o][] = i;
put[o++][] = (i+n-)%n;
vis[(i+n-)%n] = ;
a[i] --;
a[(i-+n)%n] ++;
}else if(a[i] < ){
last = ;
}
}
/*for(int i =0 ;i < n; i++){
printf("%d ", a[i]);
}puts("");*/
len = ;
last = ;
for(int k = sta;; k++){
if(len++ > n*) break;
int i = k % n;
if(vis[i] == )continue;;
if(a[i] > ){
last = ;
put[o][] = i;
put[o++][] = (i+)%n;
vis[i] = ;
a[i] --, a[(i+)%n] ++;
}
}
for(int i = ;i < n; i++){
if(a[i] != ) return ;
}
puts("YES");
printf("%d\n", o);
for(int i = ;i < o; i++){
printf("%d %d\n", put[i][]+, put[i][]+);
}return ;
}
int a[maxa], b[maxa], c[maxa];
int main(){
int t;
scanf("%d", &t);
while(t--){
memset(biaoji, , sizeof(biaoji));
int n;
scanf("%d", &n);
long long sum = ;
int ok = ;
for(int i = ;i < n; i++){
scanf("%d", &a[i]);
sum += a[i];
}
for(int i = ; i < n; i++){
if(a[i] != a[i-]){
ok = ;
break;
}
}
int ook = ;
for(int i = ;i < n; i++){
b[i] = a[i] - sum/n;
c[i] = b[i];
if(c[i] > )biaoji[i] = ;
else biaoji[i] = ;
if(b[i] > || b[i] < -) ook =;
}
if(ok == ){
puts("YES\n0");
continue;
}
if(sum % n != || ook){
puts("NO");
continue;
}
if(ans(b, n));
else if(ans1(c, n));
else puts("NO");
}
}
/*
5
6
2 0 0 2 0 2
8
3 0 0 3 0 2 0 0
8
3 0 0 3 0 0 2 0
8
0 0 3 3 0 0 2 0
8
1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000001
*/

这是a过后花了二十分钟敲的不那么丑但依旧很丑的代码

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxa = ;
int put[maxa][], vis[maxa];
int ans(int n, int a[]){
int sta= ;
for(int i = ;i < n; i++){
if(a[i] > ){
sta = i;
}
}
memset(vis, , sizeof(vis));
int len = , last = , o = ;
for(int i = sta; ;i++){
i = i%n;
if(len++ > *n) break;
if(vis[i] == ){
last= ;
continue;
}
if(last == && a[i] == ){
last = ;
continue;
}
if(a[i] > ){
vis[i] = ;
a[i] --, a[(i+)%n] ++;
put[o][] = i;
put[o][] = (i+)%n;
o++;
}else if(a[i] < ){
last = ;
}
}
len = , last = ;
for(int i = sta; ; i--){
i = (i+n)%n;
if(len++ > n*) break;
if(vis[(i+n-)%n] == ){
last = ;
continue;;
}
if(last == && a[i] == ){
last = ;
continue;
}
if(a[i] > ){
vis[(i+n-)%n] = ;
a[i] --, a[(i+n-)%n] ++;
put[o][] = i;
put[o][] = (i+n-)%n;
o++;
}else if(a[i] < ) last = ;
}
for(int i = ; i< n; i++){
if(a[i]) return ;
}
puts("YES");
printf("%d\n", o);
for(int i = ;i < o; i++){
printf("%d %d\n", +put[i][], +put[i][]);
}
return ;
}
int ans1(int n, int a[]){
int sta= ;
for(int i = ;i < n; i++){
if(a[i] > ){
sta = i;
}
}
memset(vis, , sizeof(vis));
int len = , last = , o = ;
for(int i = sta; ; i--){
i = (i+n)%n;
if(len++ > n*) break;
if(vis[(i+n-)%n] == ){
last = ;
continue;;
}
if(last == && a[i] == ){
last = ;
continue;
}
if(a[i] > ){
vis[(i+n-)%n] = ;
a[i] --, a[(i+n-)%n] ++;
put[o][] = i;
put[o][] = (i+n-)%n;
o++;
}else if(a[i] < ) last = ;
}
len = , last = ;
for(int i = sta; ;i++){
i = i%n;
if(len++ > *n) break;
if(vis[i] == ){
last= ;;continue;
}
if(last == && a[i] == ){
last = ;
continue;
}
if(a[i] > ){
vis[i] = ;
a[i] --, a[(i+)%n] ++;
put[o][] = i;
put[o][] = (i+)%n;
o++;
}else if(a[i] < ){
last = ;
}
}
for(int i = ; i< n; i++){
if(a[i]) return ;
}
puts("YES");
printf("%d\n", o);
for(int i = ;i < o; i++){
printf("%d %d\n", +put[i][], +put[i][]);
}
return ;
}
int a[maxa], b[maxa], c[maxa];
int main(){
int n, t;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
long long sum = ;
for(int i = ;i < n; i++){
scanf("%d", &a[i]);
sum += a[i];
}
if(sum % n){
puts("NO"); continue;
}
for(int i = ;i < n; i++){
b[i] = a[i] - sum /n;
c[i] = b[i];
}
if(ans(n, b)) ;
else if(ans1(n, c));
else puts("NO");
}
}

hdu5353的更多相关文章

  1. hdu5353 Average(模拟)

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

  2. hdu5353 Average

    Problem Description There are n soda sitting around a round table. soda are numbered from 1 to n and ...

  3. 2015 多校联赛 ——HDU5353(构造)

    Each soda has some candies in their hand. And they want to make the number of candies the same by do ...

  4. [hdu5353]模拟

    题意:有n个小朋友,每个小朋友手上有一些糖,考虑每两个相邻的小朋友a.b,可以选择执行3种操作中的任一种:(1)a给b一粒糖(2)b给a一粒糖(3)不进行任何动作,问能否通过确定每两个相邻的小朋友的操 ...

随机推荐

  1. symfony框架在中国移动cmwap网络下访问的问题

    最近用symfony框架给手机app做后台,发现在中国移动cmwap网络下会出现问题,所有请求都路由到根路径了 左图为原始$_SERVER对象,右图为$request->server对象由于re ...

  2. 文件操作类CFile

    CFile file; CString str1= L"写入文件成功!"; wchar_t *str2; if (!file.Open(L"Hello.txt" ...

  3. Filter及FilterChain的使用详解

    原文地址:http://blog.csdn.net/zhaozheng7758/article/details/6105749 一.Filter的介绍及使用 什么是过滤器? 与Servlet相似,过滤 ...

  4. 几个强大的oracle自带函数,可根据日期算年纪,根据数值匹配字段

    select A.USER_NAME, decode(A.SEX, 1, '男', 2, '女')AS SEX, A.HEAD_PORTRAIT, TRUNC(months_between(sysda ...

  5. 怎么把QQ我的收藏表情图片转移到另一台电脑上

    把收藏的QQ表情从一台电脑转移到另一台电脑的操作步骤如下:    1.在有表情的电脑登陆QQ,随便打开一个聊天窗口,点击[表情],选择[表情设置],点击[导入导出表情包],选择[导出全部表情包]:   ...

  6. Android中如何利用attrs和styles定义控件

    一直有个问题就是,Android中是如何通过布局文件,就能实现控件效果的不同呢?比如在布局文件中,我设置了一个TextView,给它设置了 textColor,它就能够改变这个TextView的文本的 ...

  7. 8.2.1.13 Multi-Range Read Optimization 多个range 读优化

    8.2.1.13 Multi-Range Read Optimization 多个range 读优化 读记录使用一个range scan 在一个secondary index 可以导致很多的随机磁盘访 ...

  8. head,tail,cat,more,less

    tail FILE -n 4,查看文件最后4行内容head FILE -n 10,查看文件最前4行内容 使用cat more less都可以查看文本内容,但是它们三者有什么区别呢?more和less的 ...

  9. 【转】C++动态创建二维数组,二维数组指针

    原作者博客:蒋国宝的IT技术博客 今天完成一道题目需要自己用指针创建一个二维的数组,不得不承认指针的确是恶心. int **result; ; ; result = new int*[row]; ; ...

  10. Boyang Tex上海帛扬时装面料有限公司

    Boyang Tex 上海帛扬时装面料有限公司是一家从事开发.推广销售高级时装面料的专业公司.各国高级男女时尚面料荟萃,引领时尚潮流,为国内外众多知名服饰品牌提供最 新颖时尚的高档时装面料,产品为众多 ...