51nod - 1420 - 数袋鼠好有趣 - 贪心 - 二分

https://www.51nod.com/Challenge/Problem.html#!#problemId=1420
一开始乱搞了一发,每个袋鼠二分找最小的能放它的,然后二分的范围从下一个开始保证不会把两个小袋鼠装在同一个里面,还过了一半的数据……

然后才发现袋鼠并不能嵌套。想打vis标记大袋鼠跳过大袋鼠,然后样例都过不了。

又想了半天网络流,流个鬼鬼流。

看了一下别人的提示,贪心加二分。

好像我误解了别人的贪心加二分,跑得比别人还快快。

明显选的袋鼠一定是最小的那波,这样最优。

然后二分选的袋鼠的数量,套在我第一次交的那个里面,一发就过了,500ms,应该是正解的做法。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n;
int a[500005];
int cpa[500005];

bool check(int m) {
    int be=m,en=n;
    for(int i=0; i<m; i++) {
        int res=lower_bound(a+be,a+en,2*a[i])-a;
        if(res==en)
            return false;
        else {
            be=res+1;
        }
    }
    return true;
}

int main() {
    while(~scanf("%d",&n)) {
        for(int i=0; i<n; i++) {
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        for(int i=0;i<m;i++){

        }

        int ans=0;
        int l=0,r=n/2;
        while(1) {
            int m=(l+r)>>1;
            if(m==l){
                if(check(r)){
                    ans=n-r;
                }
                else{
                    ans=n-l;
                }
                break;
            }
            if(check(m)){
                l=m;
            }
            else{
                r=m-1;
            }
        }
        printf("%d\n",ans);
    }
}

然后看见一个更惊人的,从每个袋鼠开始选最大的能放进它的。好像没什么问题,这个贪心策略是对的。

2,4,5,8
从小的开始贪心,错在假如2用了4,虽然减少了一个,但假如2用了5,4用了8,那就减少两个。因为使用了4会影响4不能选8,所以不能这样贪心。

但是从大的开始贪心就没问题,例如8可以装4,可以装2,那装4一定更好。(对个鬼鬼,假如有3呢?把4吃了2放哪里?)。

其实这个策略的正确性应该在于先分成前后两部分(至于为什么要把奇数多出来的放在后部分,其实特判cnt不能超过n/2也可以,不然就有可能嵌套),前部分从后部分中选最合适的。这样不会有嵌套。但居然也是500ms,感觉被骗了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n;
int a[500005];
int main() {
    while(~scanf("%d",&n)) {
        for(int i=0; i<n; i++) {
            scanf("%d",&a[i]);
        }
        sort(a,a+n,greater<int>());

        int cnt=0;
        for(int i=(n+1)/2;i<n;i++){
            if(a[cnt]>=2*a[i])
                cnt++;
        }

        printf("%d\n",n-cnt);
    }
}

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n;
int a[500005];
int main() {
    while(~scanf("%d",&n)) {
        for(int i=0; i<n; i++) {
            scanf("%d",&a[i]);
        }
        sort(a,a+n,greater<int>());

        int cnt=0;
        for(int i=0;i<n;i++){
            if(a[cnt]>=2*a[i]){
                cnt++;
                if(cnt==n/2)
                    break;
            }
        }

        printf("%d\n",n-cnt);
    }
}

原文地址:https://www.cnblogs.com/Yinku/p/10798879.html

时间: 2024-11-11 03:38:58

51nod - 1420 - 数袋鼠好有趣 - 贪心 - 二分的相关文章

51nod 1420 数袋鼠好有趣【贪心】

1420 数袋鼠好有趣 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有n只袋鼠.每只袋鼠的大小用一个整数表示.一只小袋鼠能装进一只大袋鼠的条件是,大袋鼠的大小至少是小袋鼠的两倍. 每只大袋鼠最多可以装一只袋鼠.小袋鼠被装进大袋鼠之后就不能再装其它的袋鼠了. 小袋鼠被装进大袋鼠之后就不能被我们看见了.请找出一个装袋鼠的方案,使得被看见的袋鼠最少. Input 单组测试数据. 第一行包含一个整数n(1≤n≤5*

贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

题目传送门 1 /* 2 贪心/二分查找:首先对ai%=p,然后sort,这样的话就有序能使用二分查找.贪心的思想是每次找到一个aj使得和为p-1(如果有的话) 3 当然有可能两个数和超过p,那么an的值最优,每次还要和an比较 4 注意:不能选取两个相同的数 5 反思:比赛时想到了%p和sort,lower_bound,但是还是没有想到这个贪心方法保证得出最大值,还是题目做的少啊:( 6 */ 7 #include <cstdio> 8 #include <algorithm>

Card Game Cheater(贪心+二分匹配)

Card Game Cheater Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1566    Accepted Submission(s): 822 Problem Description Adam and Eve play a card game using a regular deck of 52 cards. The rule

[2016-05-09][51nod][1002 数塔取数问题]

时间:2016-05-09 19:25:06 星期一 题目编号:[2016-05-09][51nod][1002 数塔取数问题] 题目大意: 一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值.每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上. 分析:动态规划 dp[i][j] 表示到 dp[i][j]时的最大值 dp[i][j] = max(dp[i-1][j],dp[i - 1][j - 1]) + a[i][j]; ans = max(dp

51nod 1770 数数字

1770 数数字 基准时间限制:1 秒 空间限制:262144 KB 分值: 20 难度:3级算法题  收藏  关注 统计一下 aaa ? aaan个a × b 的结果里面有多少个数字d,a,b,d均为一位数. 样例解释: 3333333333*3=9999999999,里面有10个9. Input 多组测试数据. 第一行有一个整数T,表示测试数据的数目.(1≤T≤5000) 接下来有T行,每一行表示一组测试数据,有4个整数a,b,d,n. (1≤a,b≤9,0≤d≤

hdu 1969 Pie(贪心+二分查找)(简单)

Pie Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5628    Accepted Submission(s): 2184 Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I

CodeForces - 1251D (贪心+二分)

题意 https://vjudge.net/problem/CodeForces-1251D 您是一个大型企业的负责人.在您的企业当中共有n位员工为您工作,而且非常有趣的事是这个n是一个奇数(n不能被2整除). 您必须给你的员工分配工资.最初,您有s美元,而第ii个员工应得的薪水应该是li?∼ri?之间的一个值.而无论怎么分配每个人的工资,您必须使得所有分配的工资的中位数最大. 对于一个长度为奇数的序列,如果要找到他的中位数,就需要先对这个序列进行排序,之后找到中间位置的数字.举例来说: 序列[

51nod 1243 排船的问题(二分)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 题意: 思路: 二分来做,每次贪心的把船安排到能安排的最左边即可. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack>

UVa 714 Copying Books(贪心 二分)

题意  把m数分成k组  使每组数的和的最大值最小  如果有多种分法 靠前的组的和尽量小 关键是找出那个最小的最大值   可以通过二分来找出  开始左端点为m个数中最大的数  右端点为m个数的和  若中点能将m个数分为小于等于k组  比它大的肯定都是可以的  中点变为右端点   否则中点变成左端点 然后就可以贪心逆向模拟了  从后往前每组选择尽量多的数直到剩下的数等于组数 #include <bits/stdc++.h> using namespace std; typedef long lo