题目链接:http://codeforces.com/contest/352/problem/C
题意:给予N*2个数字,改变其中的N个向上进位,N个向下进位,使最后得到得数与原来数的差的绝对值最小
思路:2n个数(设小数部分都看做x),n个向下取整,相对原来的数-x,n个向下取整,相对原来的数+(1-x),从两个式子中可以看出x的前面都是负号,所以可以统一处理,那么剩下来的就是统计1的个数cnt了。如果不出现a.000的情况的话,那么cnt=n,因为a.000如果向上取整的话是不需要+1的,所以统计出现a.000的次数num,那么+1的个数就在(max(0,n-num),n)之间了,取最佳ans就够了。
#include <bits/stdc++.h>
#define maxn 100005
#define MAXN 100005
#define mod 1000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int n,m,cnt;
double ans,sum;
int main()
{
int i,j,mi;
ll t;
double s,tmp;
while(~scanf("%d",&n))
{
m=2*n;
cnt=0;
sum=0;
for(i=1;i<=m;i++)
{
scanf("%lf",&s);
t=ll(s);
if(t==s) cnt++;
else
{
tmp=s-t;
sum+=tmp;
}
}
mi=min(n,cnt);
ans=INF;
for(i=0;i<=mi;i++)
{
ans=min(ans,fabs(n-i-sum));
}
printf("%.3f
",ans);
}
return 0;
}