CodeForces 351A Jeff and Rounding

来源:互联网 发布:js获得tr中第一个td 编辑:程序博客网 时间:2024/05/21 06:29
题目大意:给你2*n个数,然后你执行n个操作,每个操作选定两个数,一个数变成不大于它的整数,另一个是不小于它的整数,然后要你求出
n个操作后,原序列和操作后的差的绝对值的最小值。
思路:如果一个数的小数部分为 a,那么往下就是a,网上就是 1-a,然后要选n个数往下,n个数往上,a-(1-b) = a+b-1,而所有的a和是确定的,所以就是
-几个1的问题,使这个绝对值最小。这 1 也不能随便-,因为如果正好是整数,就不是 1-a,而是直接是 0,所以那些 a > 0的数才有可能往上增加,所以就是统计
一下就行了,然后取最小。
CF的A题啊,就是想不出来怎么搞,挫。。= =

代码如下:

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int MAXN = 2222<<1;double a[MAXN];int main(){    int n;    while(~scanf("%d",&n))    {        double sum = 0;        int z = 0;        for(int i = 0;i < (n<<1);i++)        {            scanf("%lf",&a[i]);            double tmp = a[i]-floor(a[i]);            if(tmp > 0)                z++;            sum += tmp;        }        double ans = 1e9;        for(int i = max(0,z-n);i <= min(z,n);i++)        {            ans = min(ans,fabs(sum-i));        }        printf("%.3f\n",ans);    }    return 0;}


原创粉丝点击