题目: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 }