Jeff and Rounding(Codeforces Round #204 (Div. 2))

题目链接: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;
}
原文地址:https://www.cnblogs.com/shmilky/p/14089013.html