[CF 351A]Jeff and Rounding[greedy]

题意:

给出一个数列, 实数的, 共有偶数项. 选出两项, 其一向上取整, 另一向下取整. 得到新的整数数列. 某种取法可以使得新旧数列之间的差的绝对值最小. 求这个最小的绝对值.

思路:

这种题关键是找出规律..

首先,随机选出一对非整数, old - new = sumof2 - 1. 由此可见, 选出一对非整数 和如何组合无关. 只要是认为某数和非整数组合, 就会有前式成立.

当选出非整数和整数组合时, 非整数可以向上取整或向下取整. 因为对于整数, 两种情况都不变. 此时 old - new = double - 0 or 1....

两种情况综合起来, 就是将所有非整数加起来, 整数相当于缓冲区... 不能缓冲的非整数只能和非整数组合, 减去这种的组合个数. 可以缓冲的就贪心, 减或不减. 需要注意, 可能一开始就是负的了, 需要最后取一下绝对值.

感觉还是图样了..><

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const double EPS = 1e-5;
const int MAXN = 4005;
int n,num;
double a[MAXN];
int main()
{
    num = 0;
    scanf("%d",&n);
    double sum = 0;
    for(int i=0;i<2*n;i++)
    {
        double tmp;
        scanf("%lf",&tmp);
        if(fabs(tmp - (int)tmp)<EPS)    continue;
        a[++num] = tmp - (int)tmp;
        sum += a[num];
    }
    if(!num)
    {
        printf("0.000\n");
        return 0;
    }
    int rest = 2*n - num;
    int sub = 2*n - 2*rest;
    if(sub<0)   sub = 0;
    sub >>= 1;
    sum -= sub;
    double ans = sum;
    for(int i=1;i<=rest;i++)
    {
        ans = min(ans, fabs(sum-i));
    }
    ans = fabs(ans);
    printf("%.3lf\n",ans);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值