HDU 5353 Average 贪心

就是贪心啊,不知道为啥总是不过,总是WA

方法不对吗?

将数组扩展一倍,从左到右扫描,大于平均数就给右边的,小于就从右边拿,等于就不变,记录下操作类型。

大于2直接NO,应该是正确的算法吧,自己出了一些数据也都过了

  1 #pragma comment(linker, "/STACK:102400000,102400000")
  2 #include <iostream>
  3 #include <cstdio>
  4 #include <fstream>
  5 #include <algorithm>
  6 #include <cmath>
  7 #include <deque>
  8 #include <vector>
  9 #include <queue>
 10 #include <string>
 11 #include <cstring>
 12 #include <map>
 13 #include <stack>
 14 #include <set>
 15 #define LL long long
 16 #define INF 0x3f3f3f3f
 17 #define MAXN 200005
 18 using namespace std;
 19 struct Node
 20 {
 21     int x, y;
 22     Node(int x = 0, int y = 0):x(x), y(y){};
 23 };
 24 vector<Node> res;
 25 int n;
 26 LL sum;
 27 LL a[MAXN];
 28 int f[MAXN];
 29 int main()
 30 {
 31 #ifndef ONLINE_JUDGE
 32     freopen("in.txt", "r", stdin);
 33     //freopen("out.txt", "w", stdout);
 34 #endif // OPEN_FILE
 35    int T;
 36    scanf("%d", &T);
 37    for(int cas = 1; cas <= T; cas++){
 38         scanf("%d", &n);
 39         sum = 0;
 40         for(int i = 1; i <= n; i++){
 41             scanf("%d", &a[i]);
 42             a[i + n] = a[i];
 43             sum += a[i];
 44         }
 45         if(sum % n != 0){
 46             printf("NO\n");
 47             continue;
 48         }
 49         LL ave = sum / n;
 50         memset(f, 0, sizeof(f));
 51         bool noans = false;
 52         for(int i = 1; i < 2 * n; i++){
 53             if(a[i] == ave){
 54                 continue;
 55             }
 56             if(a[i] < ave){
 57                 if(ave - a[i] > 2){
 58                     noans = true;
 59                     break;
 60                 }
 61                 a[i]++;
 62                 a[i + 1]--;
 63                 f[i] = 1;
 64                 continue;
 65             }
 66             if(a[i] > ave){
 67                 if(a[i] - ave > 2){
 68                     noans = true;
 69                     break;
 70                 }
 71                 a[i]--;
 72                 a[i + 1]++;
 73                 f[i] = -1;
 74             }
 75         }
 76         if(noans){
 77             printf("NO\n");
 78             continue;
 79         }
 80         noans = true;
 81         int cnt = 1;
 82         int pos = 0;
 83         for(int i = 2; i <= 2 * n; i++){
 84             if(a[i] == a[i - 1]){
 85                 cnt++;
 86             }
 87             else{
 88                 cnt = 1;
 89             }
 90             if(cnt == n){
 91                 noans = false;
 92                 pos = i;
 93                 break;
 94             }
 95         }
 96         if(noans){
 97             printf("NO\n");
 98             continue;
 99         }
100         printf("YES\n");
101         int x, y;
102         res.clear();
103         for(int i = pos - n + 1; i <= pos; i++){
104             if(f[i] == 0){
105                 continue;
106             }
107             if(f[i] == 1){
108                 x = i + 1;
109                 y = i;
110             }
111             else{
112                 x = i;
113                 y = i + 1;
114             }
115             if(x > n){
116                 x -= n;
117             }
118             if(y > n){
119                 y -= n;
120             }
121             res.push_back(Node(x, y));
122         }
123         printf("%d\n", res.size());
124         for(int i = 0; i < res.size(); i++){
125             printf("%d %d\n", res[i].x, res[i].y);
126         }
127    }
128 }
时间: 2024-10-14 00:37:21

HDU 5353 Average 贪心的相关文章

HDU 5353—— Average——————【贪心+枚举】

Average Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2069    Accepted Submission(s): 517Special Judge Problem Description There are n soda sitting around a round table. soda are numbered fr

HDU 5353 Average(平分值,求步聚)多校6

Average Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1948    Accepted Submission(s): 495 Special Judge Problem Description There are n soda sitting around a round table. soda are numbered

HDU 5353 Average

题意:有n个人坐在圆桌上,每个人带着糖果若干,每次只能给旁边的人1科糖果,而且坐相邻的两个人最多只能给一次(要么你给我,要么我给你),问是否能将糖果平均分了. 思路:明显每个人最多只能多于平均值2个糖果,因为他只能分别往左和右边的人给1颗.而多于平均值1的人可以任意选1个方向,只要到最后所有人满足了即可.多余糖果超过3的.平均数是浮点型的都是无解. 在第i和第i+1个人之间建两条边(即无向边拆成2条有向边),分别从一方指向另一方.1和n也建两条.分两步: (1)将持有2个多余糖果的人先处理,用D

hdu 4869 Task(贪心)

题目链接:hdu 4869 Task 题目大意:有n台机器,m个任务,每个机器和任务都有有xi和yi,要求机器的xi,yi均大于等于任务的xi和yi才能执行任务.每台机器一天只能执行一个任务.要求完成的任务数尽量多,并且说金额尽量大.完成每个任务的金额为xi?500+yi?2 解题思路:贪心,mach[i][j]表示等级为i,时间为j的机器数量,task[i][j]表示等级为i,时间为j的机器数量.每次优先减少i,因为对应等级减少100,对应的金额代价也不会减少超过500(即时间减少1). 每次

HDU 4864 Task(贪心)

HDU 4864 Task 题目链接 题意:有一些机器和一些任务,都有时间和等级,机器能做任务的条件为时间等级都大于等于任务,并且一个任务只能被一个机器做,现在求最大能完成任务,并且保证金钱尽量多 思路:贪心,对于每个任务,时间大的优先去匹配,时间相同的,等级大的优先去匹配,因为时间占得多,时间多1就多500,而等级最多才差200.然后匹配的时候,尽量使用等级小的去匹配,而时间只要大于它的都可以用,因为是按时间优先,所以如果该时间能匹配大的,其他肯定也能匹配,那么肯定优先匹配大的,所以只要在等级

HDU 4811 Ball(贪心)

2014-05-15 22:02 by Jeff Li 前言 系列文章:[传送门] 马上快要期末考试了,为了学点什么.就准备这系列的博客,记录复习的成果. 正文-计数  概率 概率论研究随机事件.它源于赌徒的研究.即使是今天,概率论也常用于赌博.随机事件的结果是否只凭运气呢?高明的赌徒发现了赌博中的规律.尽管我无法预知事件的具体结果,但我可以了解每种结果出现的可能性.这是概率论的核心. "概率"到底是什么?这在数学上还有争议."频率派"认为概率是重复尝试多次,某种结

HDU 4912 LCA+贪心

Paths on the tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 531    Accepted Submission(s): 182 Problem Description bobo has a tree, whose vertices are conveniently labeled by 1,2,…,n. Th

HDU 1661 Assigments 贪心法题解

Problem Description In a factory, there are N workers to finish two types of tasks (A and B). Each type has N tasks. Each task of type A needs xi time to finish, and each task of type B needs yj time to finish, now, you, as the boss of the factory, n

2014多校第一场D题 || HDU 4864 Task (贪心)

题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于任务的等级.一台机器只能完成一个任务,一个任务只能被一台机器完成.每个机器完成一个任务公司能够获得500*xi+2*yi (此处xy都是指被完成的任务的).输出所有机器能完成的最多任务数,和最大盈利. 思路 :贪心,自己做的时候想了各种排序都不对,没有考虑到500*xi+2*yi 这个公式的重要性.