题目链接
题意:简单来说必须立足于当前值等于A序列中的一个值才能去增加
【0,ki】范围内的值并且k- -。贪心的想法就是尽可能的让最终自己的数大,我们先从A序列中选一个最大的数且处于【0,m】以内,然后每次转移的时候判断a[i]-a[i-1]的差值即可,当累计的差值大于当前有效k时就给自己的值进行上一轮的值更新,再继续处理下去。
ll a[21111];
ll s[21111];
signed main()
{ll t;read(t);ll ca=0;while(t--){ll n,m,k;read(n);read(m);read(k);ca++;for(int i=1; i<=n; i++){read(a[i]);}printf("Case #%lld:\n",ca);sort(a+1,a+1+n);if(a[1]>m){printf("madan!\n");continue;}if(a[n]<=m){printf("why am I so diao?\n");continue;}ll pos=upper_bound(a+1,a+1+n,m)-a-1;ll op=a[pos];ll cnt=0;for(int i=pos+1; i<=n; i++){ll ok=a[i]-a[i-1];if(ok>k)break;cnt=cnt+ok;if(cnt>k){op=op+(cnt-ok);k--;i--;cnt=0;if(a[i]-op>k||k==0){break;}}else{if(i==n){op=op+k;break;}}}if(op>=a[n]){printf("why am I so diao?\n");continue;}else{printf("madan!\n");continue;}}}