HihoCode-1053-居民迁移

解法:

一开始不会做,看到标签说是贪心加二分忽然就会了,二分是分的是人口最多居住点的人口,检查人口最多的居住点人口为mid是否可行。贪心是如果从左往右循环就尽量把人口往左迁移,如果从右往左循环就尽量把人口往右迁移。

  • 二分 + 贪心

    1053 居民迁移 AC G++ 201ms 7MB
    #include "bits/stdc++.h"
    using namespace std;
    typedef long long LL;
    typedef pair<int, int> PII;
    const int MAXN = 100005;
    PII arr[MAXN];
    int t, n, m;
    bool check(int mid) {
        int k = 0, id = 1;
        for (int i = 1; i <= n; i++) {
            // 第i号居住点的居民已经无法迁移到第id号居住点的情况
            while (arr[i].first - arr[id].first > m) {
                // 让第i号居住点的居民迁移到下一个居住点,并初始化第id + 1号居住点的人口为0;
                id++;
                k = 0;
            }
            k += arr[i].second;
            // 因为每个居住点最多住mid人,当k大于mid时,剩下的居民要去下一个居住点
            while (k > mid) {
                k -= mid;
                id++;
            }
            // 前者表示越出,无第id号居住点;后者表示第i号点的居民无法迁移到第id号点,但是前面的点都满员了;
            if (id > n || arr[id].first - arr[i].first > m) {
                return false;
            }
         }
         return true;
    }
    int main() {
        scanf("%d", &t);
        while (t--) {
            scanf("%d%d", &n, &m);
            for (int i = 1; i <= n; i++) {
                scanf("%d%d", &arr[i].first, &arr[i].second);
            }
            sort(arr + 1, arr + 1 + n);
            int l = 1, r = 1e9;
            while (l < r - 1) {
                int mid = l + r >> 1;
                if (check(mid)) {
                    r = mid;
                } else {
                    l = mid;
                }
            }
            printf("%d\n", r);
        }
        return 0;
    }

原文地址:https://www.cnblogs.com/Angel-Demon/p/10459880.html

时间: 2024-11-10 13:53:58

HihoCode-1053-居民迁移的相关文章

hihoCoder #1053 : 居民迁移(贪心,二分搜索,google在线技术笔试模拟)

#1053 : 居民迁移 时间限制:3000ms 单点时限:1000ms 内存限制:256MB 描述 公元2411年,人类开始在地球以外的行星建立居住点.在第1326号殖民星上,N个居住点分布在一条直线上.为了方便描述,我们设第i个居住点的位置是Xi,其中居住着Yi位居民.随着冬季的到来,一些人口较多的居住点的生态循环系统已经开始超负荷运转.为了顺利度过严冬,殖民星上的居民一致同意通过转移到人口较少的居住点来减轻人口众多的居住点的负荷. 遗憾的是,1326殖民星的环境非常恶劣.在冬季到来前,每个

HihoCoder 1053 : 居民迁移 二分+贪心+双指针

居民迁移 时间限制:3000ms 单点时限:1000ms 内存限制:256MB 描述 公元2411年,人类开始在地球以外的行星建立居住点.在第1326号殖民星上,N个居住点分布在一条直线上.为了方便描述,我们设第i个居住点的位置是Xi,其中居住着Yi位居民.随着冬季的到来,一些人口较多的居住点的生态循环系统已经开始超负荷运转.为了顺利度过严冬,殖民星上的居民一致同意通过转移到人口较少的居住点来减轻人口众多的居住点的负荷. 遗憾的是,1326殖民星的环境非常恶劣.在冬季到来前,每个居民点的居民最远

HihoCoder 1053 居民迁移

居民迁移 时间限制:3000ms 单点时限:1000ms 内存限制:256MB 描述 公元2411年,人类开始在地球以外的行星建立居住点.在第1326号殖民星上,N个居住点分布在一条直线上.为了方便描述,我们设第i个居住点的位置是Xi,其中居住着Yi位居民.随着冬季的到来,一些人口较多的居住点的生态循环系统已经开始超负荷运转.为了顺利度过严冬,殖民星上的居民一致同意通过转移到人口较少的居住点来减轻人口众多的居住点的负荷. 遗憾的是,1326殖民星的环境非常恶劣.在冬季到来前,每个居民点的居民最远

hiho_1053_居民迁移

题目大意 有N个居民点在一条直线上,每个居民点有一个x表示坐标,y表示居民点的现有居民数.现在要求将居民点的居民重新分配,每个居民点的居民最远迁移的距离为R,要求分配完之后,居民点中居民数最多的居民点的居民数最少.求出居民数最多的居民点的居民数的最少值. 题目分析 求最大最小值/最小最大值的问题,可以尝试二分法,给出边界,取边界中点作为尝试值,判断尝试值是否满足要求,根据是否满足,不断调整边界,最后得到最大最小值/最小最大值.     自己做的时候,只知道具体的框架,但是没有解出来,最后参考了 

[noi2002]银河英雄传说

Description 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展.        宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌.        杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 3000

P1196 银河英雄传说(加权并查集)

P1196 银河英雄传说 题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压 顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨 威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在 这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 30000.之后

【NOI2003】银河英雄传

迭代不一定比递归好 原题: 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, -, 30000.之后,他把自己的战舰

银河英雄传说(NOI2002)

描述 Description 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 30000.之后,他把自己的战

并查集 (Union-Find Sets)及其应用

定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并. 主要操作 初始化 把每个点所在集合初始化为其自身. 通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N). 查找 查找元素所在的集合,即根节点. 合并 将两个元素所在的集合合并为一个集合. 通常来说,合并之前,应先判断两个元素是否属于