2 条题解

  • 0
    @ 2025-10-8 17:07:12
    #include <bits/stdc++.h>
    using namespace std;
    int n, d, m;
    int a[1000005];
    int l = 0, r, mid;
    int sum;
    bool check(int x) { //判断函数
        sum = 0; //记录当前完成了几个任务。
        for (int i = 1; i <= n; ++i) { //当前是第几天
            if (sum >= m) { //如果完成的任务数和总任务数相同
                return 1; //已经完成了任务,x个人是可行的,返回True
            }
            for (int j = 1; j <= x; ++j) { //枚举每台机器
                if (a[sum] <= i && sum < m) { //如果这个食品已经生产出来了并且食品还没有吃完
                    if (a[sum] + d < i) { //如果这个食品过期了,说明会吃不完
                        return 0; //x个人不可行
                    }
                    ++sum; //否则,吃掉这个食品
                } else { //如果食品还没生产出来或者已经生产完了
                    break; //今天无法完成更多食品了,跳到下一天
                }
            }
        }
        return sum >= n; //返回是否吃完了食品
    }
    int main() {
        scanf("%d%d%d", &n, &d, &m); //输入 
        r = m; //设置最大值 
        for (int i = 1; i <= m; ++i) {
            scanf("%d", &a[i]);
        }
        sort(a + 1, a + m + 1); //排序 
        while (l < r) { //二分 
            mid = (l + r) >> 1; //取中间值 
            if (check(mid)) { //如果可以 
                r = mid; //看看有没有更少的人 
            } else {
                l = mid + 1; //看看有没有更多得人 
            }
        }
        printf("%d", r); //输出 
        return 0; //结束 
    }
    
    • 0
      @ 2025-10-8 17:07:02
      #include <bits/stdc++.h>
      using namespace std;
      int n, d, m;
      int a[1000005];
      int l = 0, r, mid;
      int sum;
      bool check(int x) {//判断函数
      	sum = 0;//记录当前完成了几个任务。
      	for (int i = 1; i <= n; ++i) {//当前是第几天
      		if (sum >= m) {//如果完成的任务数和总任务数相同
      			return 1;//已经完成了任务,x个人是可行的,返回True
      		}
      		for (int j = 1; j <= x; ++j) {//枚举每台机器
      			if (a[sum] <= i && sum < m) {//如果这个食品已经生产出来了并且食品还没有吃完
      				if (a[sum] + d < i) {//如果这个食品过期了,说明会吃不完
      					return 0;//x个人不可行
      				}
      				++sum;//否则,吃掉这个食品
      			}else {//如果食品还没生产出来或者已经生产完了
      				break;//今天无法完成更多食品了,跳到下一天
      			}
      		}
      	}
      	return sum >= n;//返回是否吃完了食品
      }
      int main() {
      	scanf("%d%d%d", &n, &d, &m);//输入 
      	r = m;//设置最大值 
      	for (int i = 1; i <= m; ++i) {
      		scanf("%d", &a[i]);
      	}
      	sort(a + 1, a + m + 1);//排序 
      	while (l < r) {//二分 
      		mid = (l + r) >> 1;//取中间值 
      		if (check(mid)) {//如果可以 
      			r = mid;//看看有没有更少的人 
      		}else {
      			l = mid + 1;//看看有没有更多得人 
      		}
      	}
      	printf("%d", r);//输出 
      	return 0;//结束 
      }
      • 1

      信息

      ID
      4522
      时间
      1000ms
      内存
      32MiB
      难度
      10
      标签
      递交数
      3
      已通过
      1
      上传者