codeforces#571Div2 D---Vus the Cossack and Numbers【贪心】

题目http://codeforces.com/contest/1186/problem/D

题意:给定一个大小为$n$的浮点序列,这$n$个数的和为0.

现在对这个序列中的每个数,进行向上取整或向下取整的操作,使得得到的整数序列之和也是0.

思路:假设我们现在的某一种取法得到的和是$ans$,那么改变其中一个数的取法对$ans$的改变可能是+1或是-1

所以我们想随便按照某种方法得到一个结果,再进行调整就可以了。

最简单的就是我们全部先取整数部分,如果此时的$ans>0$说明负数都太小了,那么我们就找$ans$个负数,让他们改成取下整。

如果$ans<0$说明正数都太小了,我们就找$ans$个正数,让他们改成取上整于是答案就会相应增加$ans$变成了0.

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<map>
 4 #include<set>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<cmath> 
 9 #include<stack>
10 #include<queue>
11 #include<iostream>
12 
13 #define inf 0x3f3f3f3f
14 using namespace std;
15 typedef long long LL;
16 typedef pair<int, int> pr;
17 
18 int n;
19 const int maxn = 1e5 + 5;
20 float num[maxn]; 
21 
22 int main()
23 {
24     scanf("%d", &n);
25     int ans = 0;
26     for(int i = 0; i < n; i++){
27         scanf("%f", &num[i]);
28         ans += (int)num[i];
29     }
30     
31     //printf("%d\n", ans);
32     if(ans > 0){
33         for(int i = 0; i < n; i++){
34             if(num[i] > 0 || (int)num[i] == num[i] || ans <= 0)printf("%d\n", (int)num[i]);
35             else {
36                 printf("%d\n",(int)(num[i] - 1));
37                 ans--;
38             }
39         }
40     }
41     else{
42         for(int i = 0; i < n; i++){
43             if(num[i] < 0 || (int)num[i] == num[i] || ans >= 0)printf("%d\n", (int)num[i]);
44             else{
45                 printf("%d\n", (int)(num[i] + 1));
46                 ans++;
47             }
48         }
49     }
50     
51     
52     return 0;
53 }

 

posted @ 2019-07-07 10:39  wyboooo  阅读(167)  评论(0编辑  收藏  举报