OCAC暑期比赛第三场 J题 袋鼠认妈妈(加强版) 题解

袋鼠认妈妈(加强版)
原题链接:http://codeforces.com/problemset/problem/372/A
不过这道题目是一道变形题,在原题的基础上面做了修改,所以这里的标程不能过CF原题。
【题目描述】
有 n 只袋鼠(题目假设他们都是母的),你需要给他们组建成家庭。
对于第 i 只袋鼠来说,它的大小用一个数字 Si 来表示。
如果第 i 只袋鼠的大小 Si 达到了第 j 只袋鼠的大小 Sj 的两倍(即满足Si>=2*Sj),那么第 i 只袋鼠可以做第 j 只袋鼠的妈妈。
注意这道题目(加强版)和前面那道题目的区别就是:在这道题目里面,当了妈妈的袋鼠还是可以认妈妈的,但是一只袋鼠最多只能有一个女儿。
也就是说:一只袋鼠最多有一个女儿,它的女儿(乳沟有的话)也最多有一个女儿。
一只袋鼠和她的女儿和女儿的女儿和女儿的女儿的女儿和…………组成一个家庭。
为了让袋鼠尽可能地不孤单,你希望尽可能多的凑成家庭。在这种情况下,家庭的数量是最少的。
请输出进行组合后能够组成的最少的家庭数量。
举个例子:如果有4只袋鼠,它们的大小分别是 1, 2, 5, 12。那么你可以将 1 的妈妈设成 2,将 2 的妈妈设成 5,将 5 的妈妈设成 12 。
所以在这种情况下,最少的家庭数量是 1 。
【输入格式】
输入的第一行包含一个一个整数 n (1<=n<=5*10^5)。
接下来 n 行每行包含一个整数,第 i+1 行对应第 i 只袋鼠的大小 Si 。(1<=Si<=10^5)
【输出格式】
输出一个整数,表示组合后能够凑成的最少的家庭数。
【样例输入1】
8
2
5
7
6
9
8
4
2
【样例输出1】
5
【样例输入2】
8
9
1
6
2
6
5
8
3
【样例输出2】
5
【问题分析】
这道题目涉及的算法:二分。
首先我们要来分析一下,如果这道题目告诉你一个 num ,问你组成 num 个家庭的方案能够实现,你能不能做?
我们可以写一个函数 bool check(int num) ,
然后我们来分析这个 check 函数,
组件 num 个家庭,那也就是说有 k = n- num 个袋鼠要放到另一个袋鼠的口袋里(认妈妈)。
那么我们首先需要对袋鼠的大小 (我们这里用数组 a[] 表示) 从小到大排个序,
然后我们从 0 到 k-1 遍历 i,a[i]放到a[i+num]里,如果不能放,则 check 返回 false。
如果都能放,则 check 返回 true 。
然后我们看一下答案的范围是在 (n+1)/2 到 n 之间的满足 check 条件的 最小的数。
所以我们设 L = (n+1)/2 , R = n 。在这个范围内进行二分,即可找到答案。
实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 500050;
int n, a[maxn];

bool check(int num) {
    int k = n - num;
    for (int i = 0; i < k; i ++) {
        if (a[i] * 2 > a[i+num]) return false;
    }
    return true;
}

int solve() {
    int L = (n+1)/2, R = n, res;
    while (L <= R) {
        int mid = (L + R) / 2;
        if (check(mid)) {
            res = mid;
            R = mid - 1;
        } else {
            L = mid + 1;
        }
    }
    return res;
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i ++) cin >> a[i];
    sort(a, a+n);
    cout << solve() << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/ocac/p/11156526.html

时间: 2024-08-30 05:04:40

OCAC暑期比赛第三场 J题 袋鼠认妈妈(加强版) 题解的相关文章

OCAC暑期比赛第三场 I题 袋鼠认妈妈 题解

袋鼠认妈妈原题链接:http://codeforces.com/problemset/problem/372/A[题目描述]有 n 只袋鼠(题目假设他们都是母的),你需要给他们组建成家庭.对于第 i 只袋鼠来说,它的大小用一个数字 Si 来表示.如果第 i 只袋鼠的大小 Si 达到了第 j 只袋鼠的大小 Sj 的两倍(即满足Si>=2*Sj),那么第 i 只袋鼠可以做第 j 只袋鼠的妈妈.并且如果第 i 只袋鼠已经做了另一只袋鼠的妈妈的话,那么她就不能再认妈妈了.一对母女袋鼠 或者 单独的一只袋

OCAC暑期比赛第三场 E题 线上的点 题解

线上的点原题链接:http://codeforces.com/problemset/problem/251/A[题目描述]一条直线上有 n 个点,他们的坐标分别是 x1,x2,……,xn.没有两个点的坐标相同.你可以从这些点中挑选出三个点,使得三个点的最大距离不超过 d .请求出满足条件的三个点的方案数.[输入格式]输入的第一行包含两个整数 n 和 d (1<=n<=10^5; 1<=d<=10^9).接下来的一行包含 n 个整数 x1,x2,……,xn,分别表示 n 个点的坐标,

OCAC暑期比赛第三场 H题 01字符串 题解

01字符串原题链接:http://codeforces.com/problemset/problem/165/C[题目描述]一个字符串被称为“01字符串”当且仅当它只包含字符“0”和“1”.我们从字符串 s 中取出连续的一段组成的非空字符串就是 s 的子串.比如,"010" 有6个子串:"0", "1", "0", "01", "10", "010".一个字符串的两个

OCAC暑期比赛第三场 G题 汉堡汪 题解

汉堡汪原题链接:http://codeforces.com/problemset/problem/371/C[题目描述]汪老师准备做汉堡给你吃.但是汪老师只会做一种类型的汉堡,汪老师把他叫做一码汉堡.一码汉堡的组成很简单,它只由面包片(用'B'表示).香肠(用'S'表示).起司(用'C'表示)组成.汪老师有一张食谱,是一个字符串,里面标记了一码汉堡的组成.比如,如果食谱是“BBBSSC”的话,那就是说,这个汉堡是:先叠三块面包片,然后再叠两根香肠,最后再叠一片起司.这样这个汉堡就制作完成了.汪老

OCAC暑期比赛第三场 F题 魔法力量 题解

魔法力量原题链接:http://codeforces.com/problemset/problem/670/D1[题目描述]从床上起来之后,爱丽丝决定做饼干.要完成一块饼干的制作,爱丽丝需要 n 种不同的材料.对于第 i 个材料,他需要的数量为 ai .目前爱丽丝有 n 种不同的材料.对于第 i 个材料,爱丽丝拥有的数量为 bi .爱丽丝初始有 k 点魔法值,每次她可以选择消耗一点魔法值,同时生成 n 种材料中的任意一个材料.你的任务是求出爱丽丝最多能够制作多少块饼干.[输入格式]输入的第一行包

OCAC暑期比赛第一场 J题 星球语言的翻译 题解

星球语言的翻译原题链接:http://codeforces.com/problemset/problem/41/A这里做了一定的修改,比如输入数据中的两个字符串可能不一样长.[题目描述]灵灵最近接到了一份翻译工作.他需要把一份土星文翻译成木星文.已知土星文和木星文都是由26个小写的英文字母组成的.而土星文和木星文的区别仅仅在于木星文就是土星文倒着念.比如土星文的 "code" 被翻译成木星文就是 "edoc".现在灵灵收到了一份土星文,并且他翻译好了一份木星文的初稿

题解报告(CDUT暑期集训——第三场)

题解报告(CDUT暑期集训--第三场) A - Problem A. Ascending Rating HDU - 6319 思路:单调队列板子题?(但是弱的一批的我还是不会用(有空补上 用的滑动窗口算法 按着题解的从后往前做(ps:菜是原罪 AC代码 #include<stdio.h> #include<iostream> #include<math.h> #include<algorithm> #include<string.h> #incl

2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)

题目链接 题意 :小女孩注册了两个比赛的帐号,初始分值都为0,每做一次比赛如果排名在前两百名,rating涨50,否则降100,告诉你她每次比赛在前两百名的概率p,如果她每次做题都用两个账号中分数低的那个去做,问她最终有一个账号达到1000分需要做的比赛的次数的期望值. 思路 :可以直接用公式推出来用DP做,也可以列出210个方程组用高斯消元去做. (1)DP1:离散化.因为50,100,1000都是50的倍数,所以就看作1,2,20.这样做起来比较方便. 定义dp[i]为从 i 分数到达i+1

2014 HDU多校弟五场J题 【矩阵乘积】

题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存开辟都开不出来 1 #pragma comment(linker, "/STACK:16777216") 2 #include <iostream> 3 #include <stdio.h> 4 #define ll long long 5 using namesp