CodeForces - 1409

CodeForces - 1409

A - Yet Another Two Integers Problem

一直取10,剩余的一次完成

ll t,a,b;
int main()
{
    scanf("%lld",&t);
    while(t--)
    {
        scanf("%lld%lld",&a,&b);
        printf("%lld\n",(max(a,b)-min(a,b))%10==0?(max(a,b)-min(a,b))/10:(max(a,b)-min(a,b))/10+1);
    }
}



B - Minimum Product

将n次优先分配个第一个和优先分配给第二个,取min

ll t,a,b,x,y,n;
int main()
{
    scanf("%lld",&t);
    while(t--)
    {
        scanf("%lld%lld%lld%lld%lld",&a,&b,&x,&y,&n);
        WW(min((a-(min(n,a-x)))*(b-(min(b-y,n-min(n,a-x)))),(b-(min(n,b-y)))*(a-(min(a-x,n-min(n,b-y))))));
    }
}



C - Yet Another Array Restoration

枚举最小值i和间隙大小j,判断是否能够包含x,y两个数

int t,n,x,y,a,b;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        int maxx=INF;
        scanf("%d%d%d",&n,&x,&y);
        rep(i,1,50)
        {
            rep(j,1,50)
            {
                bool mark1=false,mark2=false;
                rep(k,1,n)
                {
                    int M=i+(k-1)*j;
                    if (M==x)mark1=true;
                    if (M==y)mark2=true;
                }
                if (mark1&&mark2&&i+(n-1)*j<maxx)
                {
                    maxx=i+(n-1)*j;
                    a=i,b=j;
                }
            }
        }
        rep(i,1,n)printf("%d ",a+(i-1)*b);puts("");
    }
    return 0;
}



D - Decrease the Sum of Digits

从末尾开始,将位逐步扩张为0(即假设[j--,len-1]位都为0,),以此来减小sum
注意点1:前导0
注意点2:如果末尾已经全为0,则前一位不需要进1

int t,n;
char s[maxn];
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s%d",s,&n);
        int len=strlen(s),sum=0;
        repp(i,0,len)sum+=s[i]-'0';
        if (sum<=n)W(0);
        else
        {
            for (int j=len-1;j>=0;j--)//[j,len-1]=0
            {
                bool mark=true;
                rep(i,j,len-1)if (s[i]!='0')mark=false;
                sum=mark?0:1;
                rep(i,0,j-1)sum+=s[i]-'0';
                if (sum<=n&&!mark)
                {
                    mark=true;
                    stack<int> S;
                    for (int i=len-1;i>=j;i--)
                    {
                        if (s[i]=='0'&&mark)S.push(0);
                        else if (s[i]!='0'&&mark)
                        {
                            mark=false;
                            S.push(10-(s[i]-'0'));
                        }
                        else if (!mark)S.push(9-(s[i]-'0'));
                    }
                    while(S.top()==0)S.pop();
                    while(!S.empty())
                    {
                        printf("%d",S.top());
                        S.pop();
                    }
                    puts("");
                    break;
                }
            }
        }
    }
}



E - Two Platforms

二分计算出以每一个顶点作为左端点可以接到的点的个数为len[i]
枚举左边的一段的位置,剩下的一段可以用后缀最大值来替代
(贪心:取定一段,剩下一段肯定越大越好)
一直更新答案即可

int t,n,k,a[maxn],b[maxn],r[maxn],len[maxn],maxx[maxn];
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        int ans=0;
        scanf("%d%d",&n,&k);
        rep(i,1,n)scanf("%d",&a[i]);
        rep(i,1,n)scanf("%d",&b[i]);
        sort(a+1,a+1+n);
        rep(i,1,n)
        {
            r[i]=a[i]+k;
            int pos=distance(a,upper_bound(a+1,a+1+n,r[i]));
            if (a[i]==a[i-1])len[i]=len[i-1];
            else len[i]=min(pos,n+1)-i;
            //db2(i,len[i]);
        }
        for (int i=n;i>=1;i--)
        {
            if (i==n)maxx[i]=len[i];
            else maxx[i]=max(maxx[i+1],len[i]);
        }
        rep(i,1,n)
        {
            int pos=distance(a,upper_bound(a+1,a+1+n,r[i]));
            ans=max(ans,len[i]+maxx[pos]);
        }
        W(ans);
        rep(i,1,n)maxx[i]=0;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值