题目链接:

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

题意:

给一堆和为0有正负的小数,让把小数在绝对值为1以内取整,取整后和还是0,要求输出取整后的数

思路:

一开始我就想当然得四舍五入取整,发现不对。
最主要的思想就是先取整,比如先都向下取整,然后把所有的舍掉的小数都加起来为sum,而sum一定是整数,然后就看sum是正的还是负的,多退少补,而且要满足多退少补后绝对值还是小于1就行了

#include"bits/stdc++.h"
using namespace std;
const int maxn=1e5+5;
double a[maxn];
int b[maxn];
int main()
{
	int N;
	while(cin>>N)
	{
		double tot=0;
		for(int i=1;i<=N;i++)
		{
			cin>>a[i];
			b[i]=a[i];
			tot+=a[i]-b[i];
		}
		int tt=round(tot);//必须用round,不然有精度误差 
		if(tt>0)
		{
			for(int i=1;i<=N;i++)
			{
				if(tt==0)break;
				if(a[i]>b[i])b[i]++,tt--;//小于原来值的才加 
			}
		}
		else if(tt<0)
		{
			for(int i=1;i<=N;i++)
			{
				if(tt==0)break;
				if(a[i]<b[i])b[i]--,tt++;//大于原来值的才减 
			}
		}
		for(int i=1;i<=N;i++)cout<<b[i]<<endl;
	}
	
}
/* 4 -5 1.99728 2.03313 0.96959 */