二分查找+贪心-CodeForces 732D-Exams

- 日理万妓 2022-05-17 10:46 326阅读 0赞
  • 二分查找+贪心-CodeForces 732D-Exams


  • 题目链接:D. Exams

  • 思路:二分+贪心

题目大意是给定考试天数和科目数,及对应的考试安排表、每个科目所需复习时间,求出最小完成考试的天数,如果在考试规定天数内完成不了,输出-1

真的想不到用二分。。。

通过二分,不断搜索直到找到最优区间,而最优区间的判定,用到贪心的思想

在该区间内,把考试都安排在该区间内的最后一场该考试,这样就有足够时间留给自己复习,如果这样安排都没办法满足可利用复习时间大于等于剩余科目准备时间和,就说明没办法在该区间内完成所有考试

从区间最右到最左进行安排,在此过程中需减去无法利用的空闲时间及对考完试科目标记已考状态。

70

无法利用空闲时间:在考完一科后(图中笑脸),在待考和已考之间存在一段空闲时间,但该段时间无法进行复习,所以需要从可利用复习时间中减去)

由于每次都会去除无法利用的空闲时间,所以该区间内可完成考试的条件是 可利用时间=0

  • 代码:

    include

    using namespace std;

    define MAX_SIZE 100005

    int n, m;
    int Time_Sum;

    int Schedule[MAX_SIZE];
    int Prepare_Time[MAX_SIZE];

    bool BSearch(int Floor)
    {

    1. bool Check[MAX_SIZE] = { 0 };
    2. int Free_Time = Floor - m; //区间内可支配的空闲时间
    3. int Temp_Sum = Time_Sum; //完成全部考试所需准备时间
    4. for (int i = Floor; i >= 1; i--)
    5. {
    6. if (Schedule[i] == 0 || Check[Schedule[i]]) //清除鸡肋时间:在某科考试之后的空闲时间,不能用于复习
    7. {
    8. Free_Time--;
    9. continue;
    10. }
    11. //遇到考试
    12. if (Free_Time >= Temp_Sum) //当前剩余的空闲时间必须大于等于剩余考试的准备时间
    13. {
    14. Check[Schedule[i]] = true; //标记该科目已考
    15. Temp_Sum -= Prepare_Time[Schedule[i]]; //考完,减掉该科的的准备时间
    16. }
    17. else
    18. return false; //不足以准备后面的考试
    19. }
    20. return Free_Time == 0;

    }

  1. int main()
  2. {
  3. cin >> n >> m;
  4. for (int i = 1; i <= n; i++)
  5. cin >> Schedule[i];
  6. Time_Sum = 0;
  7. for (int i = 1; i <= m; i++)
  8. {
  9. cin >> Prepare_Time[i];
  10. Time_Sum += Prepare_Time[i];
  11. }
  12. int Left = 1, Right = n;
  13. while (Left < Right) //二分查找
  14. {
  15. int Mid = (Left + Right) / 2;
  16. if (BSearch(Mid))
  17. Right = Mid;
  18. else
  19. Left = Mid + 1;
  20. }
  21. if (BSearch(Right))
  22. cout << Right << endl;
  23. else
  24. cout << "-1" << endl;
  25. return 0;
  26. }

发表评论

表情:
评论列表 (有 0 条评论,326人围观)

还没有评论,来说两句吧...

相关阅读

    相关 查找——二分查找

    基本思想 二分查找是建立在有序顺序表基础上的!步骤如下: 1.      将表中间位置记录的关键字与给定K值进行比较,若两者相等,则查找成功。 2.    

    相关 Codeforces 353E 贪心

    题意:给你一张有向图,第i条边连接i号点和(i + 1) % n号点,问最多可以选择多少个点,使得这些点互相不可达。 思路:容易发现,如果某个边的集合点的数目大于等于2,那么