2 条题解
-
0
#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
#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
- 上传者