标签:1000010 Training 12 水题 int BUPT mid printf 考试
链接:https://vjudge.net/contest/481673#overview
A - Natives
水题略
D - Exam registration
题意
n天之中,每天有\(a_i\)人考试,当天考试人数上限为\(b_i\)人。当前情况可能不合法,即存在\(a_i\geq b_i\).调整考生的考试时间来让整个考试安排合法,并且使得考试天数变动最大的学生变动最小。
思路
二分答案。确定最大调整天数后,先把每天的考试人数清空,即每天的考试人数都为0,再从左到右往里放每天的考试人员,贪心地尽量往左堆叠(不能超过范围)。如果某一步存在范围之内无法堆叠地情况该二分值就不合法。
代码
#include <bits/stdc++.h>
typedef long long ll;
ll a[1000010], b[1000010], t[1000010];
int n;
bool check(int k)
{
for (int i = 1; i <= n; i++) a[i] = 0;
int j = 1;
for (int i = 1; i <= n; i++)
{
ll tt = t[i];
while (tt)
{
while (j <= n && ((j <= i + k && a[j] == b[j]) || j < i - k)) j++;
if (j == i + k + 1 || j == n + 1) return false;
ll move = std::min(tt, b[j] - a[j]);
a[j] += move;
tt -= move;
}
}
return true;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%lld", &t[i]);
for (int i = 1; i <= n; i++) scanf("%lld", &b[i]);
int l = 0, r = n + 1;
while (l < r)
{
int mid = (l + r) >> 1;
if (check(mid))
r = mid;
else
l = mid + 1;
}
if (l == n + 1)
printf("-1\n");
else
printf("%d\n", l);
return 0;
}
F - Counting Antibodies
水题略
标签:1000010,Training,12,水题,int,BUPT,mid,printf,考试 来源: https://www.cnblogs.com/teralem/p/15926896.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。