Educational Codeforces Round 86 (Rated for Div. 2)

地址:http://codeforces.com/contest/1342

     题意:给出x,y和1操作2操作花费的费用a,b。使得x==y==0的最小花费。

     解析:两种方式,x,y中较大的先-1,x==y后再一块-1到0。第二个方式就是,x先减到0,y再减到0。取个min就可以了。

#include<iostream>
#include<cstring>
#include<map>
#include<cstdlib>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll x,y,a,b;
        cin>>x>>y>>a>>b;
        if(x==y&&x==0)
        {
            cout<<"0"<<endl;continue;
        }
        if(x>y)
        {
            ll md=x-y;
            cout<<min(md*a+y*b,x*a+y*a)<<endl;
        }
        else if(x<y)
        {
            ll md=y-x;
            cout<<min(md*a+b*x,x*a+y*a)<<endl;
        }
        else if(x==y)
        {
            cout<<min(x*b,x*a+y*a)<<endl;
        }
    }
}

     题意:给出t串,求s串,t是s的子串(题中指s删除部分元素所得的子串)。保证s的循环周期最小,lens<=2*lent。

     解析:这题有点奇怪。01竟然也输出01而且周期是2。。反正顺着题目意思写就行了,如果t串全相同,直接输出t串,否则遇见挨着相同的,中间就插一个与相邻不同的字符。

#include<iostream>
#include<cstring>
#include<map>
#include<cstdlib>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        char s[200];
        cin>>s;
        int len=strlen(s);
        int ok=0;
        for(int i=1;i<len;i++)
        {
            if(s[i]!=s[i-1])
            {
                ok=1;break;
            }
        }
        if(!ok)
            cout<<s<<endl;
        else
        {
            for(int i=0;i<len;i++)
            {
                cout<<s[i];
                if(s[i]==s[i+1])
                {
                    if(s[i]=='0')
                        cout<<"1";
                    else
                        cout<<"0";
                }
            }
            cout<<endl;
        }
    }
}

     题意:给出a,b,q。然后是q个l,r。求l,r内有多少个数满足%a%b!=%b%a。

     解析:令x=a*b。x%a%b==x%b%a==0,所以可以先看<x的数。一个连续区间去模同一个数是有周期性的,模俩也不例外,把a*b看成一个数,那么连续区间%x的周期就是a*b。可以先把a*b以内满足题目条件的数找出来,用p[]前缀和打表,下次询问时直接相减就可以了。对于R,是:p[a*b-1]*(R/(a*b))+p[R%(a*b)]。因为打表只打到了a*b-1这里,R/(a*b)是算一下R里有几个周期,R%(a*b)不满一个周期的情况。L左边的同理,注意这里是p[L-1],因为求的是个闭区间[L,R]。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=50000;
int p[maxn];
ll ac(ll nu,ll x)
{
    return p[x-1]*(nu/x)+p[nu%x];
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll a,b,q;
        cin>>a>>b>>q;
        for(int i=1;i<a*b;i++)
        {
            p[i]=p[i-1];
            if((i%a%b)!=(i%b%a))
            {
                p[i]++;
            }
        //    cout<<p[i]<<"  ";
        }
        ll x=a*b;
        while(q--)
        {
            ll l,r;
            cin>>l>>r;
            cout<<ac(r,x)-ac(l-1,x)<<" ";
        }
    }
}
原文地址:https://www.cnblogs.com/liyexin/p/12790978.html