题目链接:
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 */