(暂)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; } } } }
超时
有空优化一下