(暂)CPS题解|202303-2垦田计划|5分
#include <bits/stdc++.h>
using namespace std;
int main() {
//待开垦的区域总数、手上的资源数量、每块区域的最少开垦天数
long long fieldNum, resourceNum, leastNeedDays;
cin >> fieldNum >> resourceNum >> leastNeedDays;
int needTimes[fieldNum], needResources[fieldNum];
for (int i = 0; i < fieldNum; i++) {
//输入田地耗时和每减少一天所需的资源数目
cin >> needTimes[i] >> needResources[i];
}
//只要有资源
while (resourceNum > 0) {
//全部削减到 needTimes中的最小值
int minTime = *min_element(needTimes, needTimes + fieldNum);
for (int j = 0; j < fieldNum; j++) {
if (needTimes[j] > minTime) {
resourceNum -= needResources[j];
if (resourceNum == 0) {
//减完之后没资源了,返回当前数组中最大值
needTimes[j] -= 1;
int result = *max_element(needTimes, needTimes + fieldNum);
cout << (result < leastNeedDays ? leastNeedDays : result) << endl;
return 0;
} else if (resourceNum < 0) {
//减完之后负了,直接返回
int result = *max_element(needTimes, needTimes + fieldNum);
cout << (result < leastNeedDays ? leastNeedDays : result) << endl;
return 0;
} else {
//减完之后有盈余,继续
needTimes[j] -= 1;
}
}
}
//如果整个数组的元素都一样
if (*min_element(needTimes, needTimes + fieldNum) == *max_element(needTimes,needTimes + fieldNum)) {
//从消耗最小的元素中减掉一天继续
int minResource = needResources[0], tarK = 0;
for (int k = 0; k < fieldNum; k++) {
if (needResources[k] < minResource) {
minResource = needResources[k];
tarK = k;
}
}
if (resourceNum - minResource >= 0) {
resourceNum -= minResource;
needTimes[tarK] -= 1;
} else {
int result = *max_element(needTimes, needTimes + fieldNum);
cout << (result < leastNeedDays ? leastNeedDays : result) << endl;
return 0;
}
}
}
}
超时
有空优化一下

查看7道真题和解析