题目传送门
https://codeforces.com/contest/2038/problem/A
先大致捋一下题目的含义
一共有n个工程师,每个工程师完成相应的工作都有一定的奖金a,但同时也会消耗成本b,目前一共有k个工作需要做
这些工程师对他们的同事很友好,他们能接受自己的总收益为0来增长经验,但不能接受自己为负收益,于是就有了特判的一个解
当每个人都尽力去满足使自己的收益大于等于0的情况下没法满足工作要求,那么这些工程师就会集体罢工
也就是都输出0
接下来是题目的一个很重要的点,工作流程的顺序以及收益s的要求
这n个工程师是从前往后依次工作,对于每份工作,都要满足
收益s对于他本人,在所有人的工作数量总和尽可能大于等于k的背景下,最大化
也就是说,前边的人利益大,后边的人是牛马
也就是这道题的核心了
于是我们只需要从后往前遍历即可,我们假定每个人的s都为0,那么对应的c就等于a[i] / b[i]
当后面的人把工作都完成了,那么前边的人也就都不用工作了,他们的c值都为0
对于结束工作的这个人,我们要单独计算一下他所要完成的工作
ac代码如下
#include<bits/stdc++.h>
using namespace std;
int res, x, pos;//
void solve(){int n, k;cin >> n >> k;vector<int> a(n + 1, 0), b(n + 1, 0), ans(n + 1, 0);for(int i = 1;i <= n;i ++) cin >> a[i];for(int i = 1;i <= n;i ++) cin >> b[i];for(int i = n;i >= 1;i --){//从后往前遍历,后边的人完成的工作多x = a[i] / b[i];//在收益为0的情况下完成最多的工作ans[i] = x;//存进去res += x;if(res >= k) {//如果到这个人为止能够完成工作,就停止,记录下此时的位置pos = i;ans[i] = k - (res - x);//计算这个人要完成的工作break;}}if(res < k) {for(int i = 1;i <= n;i ++) cout << 0 << ' ';return;}else {for(int i = 1;i < pos && pos != 1;i ++) cout << 0 << ' ';for(int j = pos;j <= n;j ++)cout << ans[j] << ' ';return;}
}signed main(){ios::sync_with_stdio(false);cin.tie(nullptr);solve();return 0;
}