CodeForces 352C-- Jeff and Rounding

http://codeforces.com/problemset/problem/352/C

首先要明白一点:

给n*2个数,找到n个这样的数对,(ai,aj) ,前一个数向下取整,后一个数向下取整,输出修改后的序列和 与 原序列和 的差的最小的绝对值

首先要明白一点:

设res是 所有数都向上取整时的序列和 与 原序列和 的差值,如果一个数 ai 要改变为向下取整的话(ai 不是整数),res=fabs(res-1) ;

由于以上的推导有一个条件:ai不为整数

所以我们需要统计一下序列中整数的个数num,然后枚举减1 的次数,从而发现最优结果

由于需要向上向上取整与向下去整的个数都等于n,

所以枚举的范围是[max(0,n-num),min(n,2*n-num)]

代码:

#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
const int MAXN = 8000;
double a[MAXN];
int main()
{
    //freopen("data.in","r",stdin);
    int n;
    cin >> n;
    double x;
    for (int i = 0; i < 2 * n; i++) {
        cin >> a[i];
    }
    double sum = 0;
    int num = 0;
    for (int i = 0; i < 2 * n; i++) {
        x = ((int)a[i] + 1) * 1.0 - a[i];
        if (fabs(x - 1) <= eps) {
            num++;
        }
        else {
            sum += x;
        }
    }
    //cout<<num<<endl;
    //cout<<sum<<endl;
    int m = 0;
    if (num < n) {
        m = n - num;
    }
    double res = 0x3f3f3f3f * 1.0;
    for (; m <= min(2 * n - num, n); m++) {
        res = min(res, fabs(sum - m));
    }
    //printf("%.3llf\n",res);
    cout << fixed << setprecision(3) << res << endl;
}
时间: 2024-10-10 07:32:03

CodeForces 352C-- Jeff and Rounding的相关文章

CodeForces 351A Jeff and Rounding

题意:给你一个2×n长的序列,进行n次操作,每次操作是选取两个从未选过的数,一个取上整,一个取下整,问你最后能得到最接近原来和的序列是多少. 解题思路:先将所有小数和统计出来,然后再枚举向下取整的个数即可 ,利用的原则是  x + (1-x) = 1; 解题代码: 1 // File Name: 351a.cpg 2 // Author: darkdream 3 // Created Time: 2015年03月08日 星期日 12时21分23秒 4 5 #include<vector> 6

CF&amp;&amp;CC百套计划3 Codeforces Round #204 (Div. 1) A. Jeff and Rounding

http://codeforces.com/problemset/problem/351/A 题意: 2*n个数,选n个数上取整,n个数下取整 最小化 abs(取整之后数的和-原来数的和) 先使所有的数都下取整,累积更改的sum 那么选1个小数上取整,就会使sum-1 整数上下取整不会产生影响 所以有1个整数就可以使上取整的小数少1个 所以ans=min(abs(i-sum)) i∈[n-整数个数,n] #include<cmath> #include<cstdio> #inclu

Codeforces 351B Jeff and Furik

http://codeforces.com/problemset/problem/351/B 题意:两个人轮流游戏,先手交换相邻两个数,后手先抛硬币,正面就左大右小换,反面就右大左小换,随机找到一对数,直到整个数列上升位置,求最小期望步数. 思路:由于第一个人每次都会减少一对逆序对,而后手会50%减少一对,50%增加一对,我们把两个人凑起来就是: 50%逆序对不变,50%减少2对 f[i]=f[i]*0.5+f[i-2]*0.5 算出来就是f[i]=f[i-2]+4,初值:f[0]=0,f[1]

Codeforces 351C Jeff and Brackets 矩阵优化DP

题意:你要在纸上画一个长度为n * m的括号序列,第i个位置画左括号的花费是a[i % n], 画右括号的花费是b[i % n],问画完这个括号序列的最小花费.n <= 20, m <= 1e7 思路:如果不管n和m的限制,这个题很好做,设dp[i][j]是到i位置,平衡因子是j的花费,dp[i][j] = min(dp[i - 1][j - 1] + a[i], dp[i - 1][j + 1] + b[i]),但是这样n * m到2e8级别,这是我们无法承受的.不过,我们可以发现一个性质:

CF&amp;&amp;CC百套计划3 Codeforces Round #204 (Div. 1) D. Jeff and Removing Periods

http://codeforces.com/problemset/problem/351/D 题意: n个数的一个序列,m个操作 给出操作区间[l,r], 首先可以删除下标为等差数列且数值相等的一些数 然后可以对区间剩余数重排 继续删除下标为等差数列且数值相等的一些数 继续对区间进行重排 直至区间内没有数 问每次操作的最少删除次数 因为每次删除后可以重排 那么完全可以在第一次删除后就把区间相等的数排在一起 这样相等的数的下标就分别构成了公差为1的等差数列 所以问题转化为 设区间[l,r]内数有x

Codeforces Round #204 (Div. 2)——A找规律——Jeff and Digits

Jeff's got n cards, each card contains either digit 0, or digit 5. Jeff can choose several cards and put them in a line so that he gets some number. What is the largest possible number divisible by 90 Jeff can make from the cards he's got? Jeff must

codeforces 351B B. Jeff and Furik(概率)

题目链接: codeforces 351B 题目大意: 给出一个游戏,先手选择一对相邻的数交换位置,后手随机找一对数,然后掷硬币决定是否交换,如果不能交换,那么就重新找.问大致序列有序的采取最优策略的布数的期望. 题目分析: 定义dp[i]表示减少i个逆序对的步数的期望. dp[i]=1+1+dp[i?2]?0.5+dp[i?1+1]]?0.5 因为先手可以选择,所以它每次一定会采取操作减少一个逆序对. 我们得到dp[i] = 4 + dp[i-2],dp[0] = 0 , dp[1] = 1;

【DFS】Codeforces Round #402 (Div. 2) B. Weird Rounding

暴搜 #include<cstdio> #include<algorithm> using namespace std; int n,K,Div=1,a[21],m,ans=100; bool vis[21]; void calc(int now) { int t=0; bool flag=0; for(int i=m;i>=1;--i) if(!vis[i]) { if((!flag) && a[i]==0) return; t=t*10+a[i]; fla

Codeforces Round #415 (Div. 2)(A,暴力,B,贪心,排序)

A. Straight «A» time limit per test:1 second memory limit per test:256 megabytes input:standard input output:standard output Noora is a student of one famous high school. It's her final year in school — she is going to study in university next year.