A. 题目链接 https://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1001&cid=1030
题意:简单来说必须立足于当前值等于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;
}
}
}
|