70分的代码就是按照题意,循环找t中最大的数,每运行一次:当c[i] > m时进行天数-1,直到最大的天数的c[i] < m了才退出。
100分的代码则是新建一个数组,将天数作为下标,天数相等的资源相加,然后对天数数组进行由大到小的遍历,每循环一次检查一次m是否大于改数组的资源总数,大于则m-数组[天数],更新天数-1的数组,小于则保存结果退出。
注意事项:数组作为全局变量时会自动赋初值,所以新建的数组要写成全局变量。
#include <iostream>
#include <algorithm>
using namespace std;
int all[100005];
int main()
{
long n, m, k;
cin >> n >> m >> k;
int t[n+1], c[n+1];
t[0] = 0; //保存最大的天数
c[0] = 0; //初始化
for(int i = 1; i <= n; i++){
cin >> t[i] >> c[i];
all[t[i]] += c[i];
if(t[0] < t[i]){
t[0] = t[i];
}
}
int res = 0;
for(int i = t[0]; i >= k; i--){
if(m < all[i]) break;
m -= all[i];
all[i-1] += all[i]; //实际意义上的max天数均-1
res = i-1;
}
cout << res;
return 0;
}
这个很妙的一点在于题目所求的为最大的,当最大的减少之后又会出现最大的,所以直接将天数作为下标,资源作为数据进行保存!!!