zoukankan      html  css  js  c++  java
  • Codeforces Round #667 (Div. 3)(A->E)

    A:http://codeforces.com/contest/1409/problem/A

    题意:

    a,b,

    每一步可a+k或a-k,1<=k<=10,a=b最少需要几步

    解析:

    优先+-10,不足的一定<10,一步即可

    #include<bits/stdc++.h>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int maxn=5e3+10;
    const int maxn2=1e9+10;
    const int mod=1e9+10;
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            ll a,b;
            cin>>a>>b;
            if(a==b)
            {
                cout<<"0"<<endl;continue;
            }
            if(a<b)
            {
                ll cha=b-a;
                ll cnt1=cha/10;
                if(cha%10==0)
                    cout<<cnt1<<endl;
                else
                    cout<<cnt1+1<<endl;
            }
            else
            {
                ll cha=a-b;
                ll cnt1=cha/10;
                if(cha%10==0)
                    cout<<cnt1<<endl;
                else
                    cout<<cnt1+1<<endl;
            }
        }
    }

    B:http://codeforces.com/contest/1409/problem/B

    题意:

    a,b,x,y,n

    操作最多n次,操作为:a-1或b-1

    求操作后a*b的最小值

    解析:

    两种情况,分别算一下求最大值即可

    1:先给a,余出来的给b

    2:先给b,余出来的给a

    #include<bits/stdc++.h>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int maxn=5e3+10;
    const int maxn2=1e9+10;
    const int mod=1e9+10;
    ll a,b,x,y,n;
    ll ac1()
    {
        ll c=a,d=b,e=x,f=y,m=n;
        if((a-n)<x)
        {
            ll ch1=x-(a-n);
            m=m-ch1;
            c-=m;
            d=max(f,d-ch1);
            
        }
        else
        {
            c-=n;
        }
    //    cout<<c<<"  "<<d<<endl;
        return c*d;
    }
    ll ac2()
    {
        ll c=a,d=b,e=x,f=y,m=n;
        if((b-n)<y)
        {
            ll ch1=y-(b-n);
            m=m-ch1;
            d-=m;
            c=max(e,c-ch1);
            
        }
        else
        {
            d-=n;
        }
        return c*d;    
    
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            cin>>a>>b>>x>>y>>n;
            if(a==x&&b==y)
            {
                cout<<a*b<<endl;continue;
            }
            if(a==x)
            {
                cout<<a*max(y,b-n)<<endl;continue;
            }
            if(b==y)
            {
                cout<<max(x,a-n)*b<<endl;continue;
            }
        //    cout<<ac1()<<"  "<<ac2()<<endl;
            cout<<min(ac1(),ac2())<<endl;
        }
    }

    C:http://codeforces.com/contest/1409/problem/C

    题意:

    构建出含n个数的等差数列,包含所给的x,y

    要求max(a1,a2...an)最小

    解析:

    给出了x,y,那么要使得最大值最小,先假设y为最大。

    x~y以及1~x之间的数尽量塞满,才能保证y之后尽量少放。

    那么x~y之间的数字尽量密集。

    由于是等差数列,根据am=a1+(m-1)*d,以x为首项,y为末项,枚举这个项数m,求出最小的间距d。(d<=n)

    以这个间距d,打印x~y,1~x,y~  之间的数字即可。

    #include<bits/stdc++.h>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int maxn=5e3+10;
    const int maxn2=1e9+10;
    const int mod=1e9+10;
    ll a,b,x,y,n;
    ll ac1()
    {
        ll c=a,d=b,e=x,f=y,m=n;
        if((a-n)<x)
        {
            ll ch1=x-(a-n);
            m=m-ch1;
            c-=m;
            d=max(f,d-ch1);
            
        }
        else
        {
            c-=n;
        }
    //    cout<<c<<"  "<<d<<endl;
        return c*d;
    }
    ll ac2()
    {
        ll c=a,d=b,e=x,f=y,m=n;
        if((b-n)<y)
        {
            ll ch1=y-(b-n);
            m=m-ch1;
            d-=m;
            c=max(e,c-ch1);
            
        }
        else
        {
            d-=n;
        }
        return c*d;    
    
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int n,x,y;
            cin>>n>>x>>y;
            int mind=mod;
            for(int i=2;i<=50;i++)  //i<=50,否则对于x=1,y=50,d枚举不到1
            {
                if((y-x)%(i-1)==0&&i<=n)
                {
                    mind=min(mind,(y-x)/(i-1));
                }
            }
        //    cout<<mind<<"--"<<endl;
            int cnt=2;
            cout<<x<<" "<<y<<" ";
            ll md=x;
            while(1)
            {
                if(cnt==n)
                    break;
                md+=mind;
                if(md<y)
                {
                    cout<<md<<" ";
                    cnt++;
                }
                else
                    break;
            }
            md=x;
            while(1)
            {
                if(cnt==n)
                    break;
                md-=mind;
                if(md<=0)
                    break;
                else
                {
                    cout<<md<<" ";
                    cnt++;
                }
            }
            md=y;
            while(1)
            {
                if(cnt==n)
                    break;
                md+=mind;
                cout<<md<<" ";
                cnt++;            
            }
            cout<<endl;
        }
    }

    D:http://codeforces.com/contest/1409/problem/D

    题意:

    给2个数n,s。问n最少要加几使n的各个位置的数相加小于等于s.

    解析:

    对于本身n就不满足条件的情况,各个位子上的数,必须要加到10,才能使sum变小。

    所以从后往前,不断把<10的补到10即可,满足条件即终止。

    #include<bits/stdc++.h>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int maxn=5e3+10;
    const int maxn2=1e9+10;
    const int mod=1e9+10;
    ll a,b,x,y,n;
    ll ac1()
    {
        ll c=a,d=b,e=x,f=y,m=n;
        if((a-n)<x)
        {
            ll ch1=x-(a-n);
            m=m-ch1;
            c-=m;
            d=max(f,d-ch1);
            
        }
        else
        {
            c-=n;
        }
    //    cout<<c<<"  "<<d<<endl;
        return c*d;
    }
    ll ac2()
    {
        ll c=a,d=b,e=x,f=y,m=n;
        if((b-n)<y)
        {
            ll ch1=y-(b-n);
            m=m-ch1;
            d-=m;
            c=max(e,c-ch1);
            
        }
        else
        {
            d-=n;
        }
        return c*d;    
    
    }
    ll check(ll x)
    {
        ll sum=0;
        while(x)
        {
            ll md=x%10;
            x/=10;
            sum+=md;
        }
        return sum;
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            ll n,s;
            cin>>n>>s;
            ll sum=check(n);
            if(sum<=s)
            {
                cout<<"0"<<endl;
                continue;
            }
            ll ans=0;
            ll md=1;
            for(int i=1;i<=18;i++)
            {
                ll y=(n/md)%10;
                ll yy=md*(10-y);
                n+=yy;
                ans+=yy;
                if(check(n)<=s)
                {
                    break;
                }
                md*=10;
            }
            cout<<ans<<endl;
        }
    }

    E:http://codeforces.com/contest/1409/problem/E

    题意:

    有n个点给x,y坐标,有2个长为k的平台,点不断下落问最多能接住几个点。

    解析:

    由于平台可以放在无限往下的地方,所以这里的y就可以忽略。

    对x进行从小到大的排序。

    定义L[i],表示平台以i为右端点,所能容纳的最多点

    定义R[i],表示平台以i为左端点,所能容纳的最多点

    答案即为max(L[i],R[i+1])

    #include<bits/stdc++.h>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int maxn=2e5+10;
    const int maxn2=1e9+10;
    const int mod=1e9+10;
    ll x[maxn];
    ll r[maxn],l[maxn];
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
    //        memset(l,0,sizeof(l));
    //        memset(r,0,sizeof(r));
            ll n,k;
            cin>>n>>k;
            for(int i=1;i<=n;i++)
                {
                    cin>>x[i];
                }
            ll y;
            for(int i=1;i<=n;i++)
                cin>>y;
            sort(x+1,x+1+n);
            int j = n;
            r[j+1]=0;
            for(int i=n;i>=1;i--)
            {
                while(x[j]-x[i]>k)
                    j--;    //可容纳x[i]~x[j]
                r[i]=j-i+1;
                r[i]=max(r[i],r[i+1]);  //保留i之后的最大容纳量
            }
            j=1;
            l[0]=0;
            for(int i=1;i<=n;i++)
            {
                while(x[i]-x[j]>k)
                    j++;
                l[i]=i-j+1;
                l[i]=max(l[i],l[i-1]);
            }
            ll maxx=1;
            for(int i=1;i<=n;i++)
            {
                maxx=max(maxx,l[i]+r[i+1]);
            }
            cout<<maxx<<endl;
        }
    }
  • 相关阅读:
    【python cookbook】【字符串与文本】3.利用shell通配符做字符串匹配
    【python cookbook】【字符串与文本】2.在字符串的开头或结尾处做文本匹配
    python any()和all()用法
    【python cookbook】【字符串与文本】1.针对任意多的分隔符拆分字符串
    python编码:gbk编码与解码
    [转]ASP.NET MVC 5– 使用Wijmo MVC 5模板1分钟创建应用
    [转]ASP.NET MVC 5
    [转]ASP.NET MVC 5
    [转]ASP.NET MVC 5
    [转]ASP.NET MVC 5
  • 原文地址:https://www.cnblogs.com/liyexin/p/13620293.html
Copyright © 2011-2022 走看看