The Preliminary Contest for ICPC Asia Nanjing 2019 I. Washing clothes
思路:
- 一定有一个分界点,前面所有人手洗(对后面不产生影响),后面所有人机洗
- 对每个人来的时刻排序后,从后向前找最后一个需要手洗的人
- 满足:y > x * (n - j + 1) [j为当前人的位置,即满足手洗时间大于后面所有人机洗的时间] 则继续往前找
- 否则跳出,遍历最后一个手洗和所有机洗,查找时间最大值
#include<iostream>
#include<algorithm>
using namespace std;
int n, y;
long long t[1000005];
long long sum;
int main()
{
int j;
while (cin >> n >> y)
{
for (int i = 1; i <= n; i++)cin >> t[i];
sort(t + 1, t + n + 1);
for (int x = 1; x <= y; x++)
{
sum = 0;
for (j = n - 1; j >= 1; j--)
{
if (y > 1ll * x * (1ll * n - j + 1))continue;
else break;
}
for (int i = n; i > j; i--)
sum = max(sum, t[i] + 1ll * x * (1ll * n - i + 1));
if (j >= 1)sum = max(sum, t[j] + y);
cout << sum << (x == y ? '\n' : ' ');
}
}
return 0;
}