202303-2 CSP
试题编号: 202303-2
试题名称: 垦田计划
得分:70
代码
#include <iostream>
using namespace std;
int main()
{
int n, m, k;
cin >> n >> m >> k;
int *t = new int[n];
int *c = new int[n];
int ti_min_index = -1;
int ti_min_val = 1e6 + 1;
int ti_max_index = -1;
int ti_max_val = -1;
int reduce_to_k_sum = 0; // 全体减到k的值
int reduce_to_timin_sum = 0; // 全体减到timin的值
int sum_ci = 0;
for (int i = 0; i < n; i++)
{
cin >> t[i] >> c[i];
if (t[i] < ti_min_val)
{
ti_min_index = i;
ti_min_val = t[i];
}
if (t[i] > ti_max_val)
{
ti_max_index = i;
ti_max_val = t[i];
}
reduce_to_k_sum += c[i] * (t[i] - k);
sum_ci += c[i];
}
// 首先判断是否能直接减到k
// 其次再判断是否可以到tiMin 如果可以直接减到timin 那么在进行全体缩减即可
// 应该是全体ti(ti>temp_min)进行减少即可
// 1.判断是否减到k
if (reduce_to_k_sum <= m)
{
cout << k << endl;
return 0;
}
// 2.判断是否可以直接减到timin
for (int i = 0; i < n; i++)
{
if (i != ti_min_index)
{
reduce_to_timin_sum += c[i] * (t[i] - ti_min_val);
}
}
if (reduce_to_timin_sum > m)
{
// 不能减到 timin
// 要对最大值进行一步步减少 同时如果出现两个相同的当前最大值 要同步进行资源投入
// 找出最大值的 个数
int cnt = 0;
int temp_sum_ci = 0;
for (int i = 0; i < n; i++)
{
if (t[i] == ti_max_val)
{
cnt++;
temp_sum_ci += c[i];
}
}
while (m / temp_sum_ci >= 1)
{
// 进行遍历 每次减一天
for (int i = 0; i < n; i++)
{
if (t[i] == ti_max_val)
{
t[i]--;
}
}
ti_max_val--;
m -= temp_sum_ci;
// 寻找下一个最大值
// cnt = 0;
temp_sum_ci = 0;
for (int i = 0; i < n; i++)
{
if (t[i] == ti_max_val)
{
// cnt++;
temp_sum_ci += c[i];
}
}
}
cout << ti_max_val << endl;
return 0;
}
else if (reduce_to_timin_sum == m)
{
cout << ti_min_val << endl;
return 0;
}
else
{
// 可以减到timin 甚至可以再往下减 但是不能减到k
m -= reduce_to_timin_sum;
if (m / sum_ci >= 1)
{
cout << ti_min_val - m / (sum_ci) << endl;
return 0;
}
cout << ti_min_val << endl;
return 0;
}
return 0;
}
用时为1.031s 可以再进行优化