Prefix Purchase 题解
题意
给定一个长度为
思路
首先我们可以发现一个很显然的性质:如果满足
又因为题目要求最终序列的字典序最大(靠前的数字最大),所以我们肯定要贪心的去先选前面的,即从
但是这里有几个点需要注意:
-
因为除数不能为
0 ,所以当a_{i}=a_{i+1} 时,直接将ans_{i} 赋值为ans_{i-1} 就可以了。 -
根据题目定义,显然
ans_{i+1} 不可能大于ans_{i} ,所以操作的时候还需要特判一下。
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define inf_db 127
#define ls id << 1
#define rs id << 1 | 1
#define re register
#define endl '\n'
typedef pair <int,int> pii;
const int MAXN = 2e5 + 10;
int T,n,k,mn = 1e18,a[MAXN],ans[MAXN];
signed main()
{
cin >> T;
while(T--)
{
cin >> n;
mn = ans[0] = 1e18;
for(int i = 1;i <= n;i++) cin >> a[i];
for(int i = n;i >= 1;i--) mn = min(mn,a[i]),a[i] = mn;
cin >> k;
for(int i = 1;i <= n;i++)
{
if(a[i] - a[i - 1] == 0) ans[i] = ans[i - 1];
else ans[i] = min(k / (a[i] - a[i - 1]),ans[i - 1]);
cout << ans[i] << " ";
k -= (a[i] - a[i - 1]) * ans[i];
}
cout << endl;
for(int i = 1;i <= n;i++) ans[i] = 0;
}
return 0;
}