题意:
题解:
贪心
f[i]表示在i号点使用加速器,能使后面多少个点受益
sum[i]表示在i站及i站以前有多少人下车
找出在哪个站使用加速器最多能使多少人受益
贪心k次即可
#include#include #include #include #include #include #define ll long long#define N 10100using namespace std;int f[N],sum[N],last[N],a[N],b[N],t[N],d[N],ar[N];int gi() { int x=0,o=1; char ch=getchar(); while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar(); if(ch=='-') o=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar(); return o*x;}int main() { int n=gi(),m=gi(),k=gi(); ll ans=0; for(int i=1; i =1; i--) { if(ar[i+1]>last[i+1]) f[i]=f[i+1]+1;//严格收益 else f[i]=1;//可能在i+1站下车 } int x,y=0; for(int i=1; i y) { y=sum[i+f[i]]-sum[i]; x=i; } } d[x]--; } for(int i=2; i<=n; i++) { ar[i]=max(ar[i-1],last[i-1])+d[i-1]; } for(int i=1; i<=m; i++) { ans+=ar[b[i]]-t[i]; } printf("%lld\n", ans); return 0;}