Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1)

打cf的过程中遭受到了DDOS攻击,导致最终无法进行下去,也算是奇闻一件了

Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1)_第1张图片

A. CME

思路:看似像个火柴游戏,实则只是个判断奇偶的水题

/*
Author Owen_Q
*/

#include 

using namespace std;

typedef long long ll;

const int maxn = 1e7+5;

int a[maxn];

int main()
{
    int n,q;
    //freopen(".txt","r",stdin);
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    scanf("%d",&q);
    while(q--)
    {
        scanf("%d",&n);
        if(n==2)
            printf("%d\n",2);
        else
        {
            if(n%2==0)
                printf("%d\n",0);
            else
                printf("%d\n",1);
        }
    }
    return 0;
}

B. Strings Equalization

思路:看似是个字符串匹配题,实则只是检测两串中是否有相同字母的水题

/*
Author Owen_Q
*/

#include 

using namespace std;

typedef long long ll;

const int maxn = 115;

char s[maxn],t[maxn];
bool num1[26];
bool num2[26];
int num[26];

int main()
{
    int q;
    //freopen(".txt","r",stdin);
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    scanf("%d",&q);
    while(q--)
    {
        memset(num,0,sizeof num);
        memset(num1,false,sizeof num1);
        memset(num2,false,sizeof num2);
        scanf("%s",s);
        scanf("%s",t);
        int len = strlen(s);
        for(int i=0;i

C. Save the Nature

思路:第三题的出现,避免了让本场成为手速场,细思之,这题还是蛮不错的

有n张不同票价的影票,按任意顺序出售,现需将位于a倍数的电影票和b倍数的电影票按一定折扣售出,求达到一定销售额最少所需出售的票数。

如果是为了将所有票售出,那么将高额电影票分配到高价格的位置即为最优策略,但由于为了使售出票数最少,即需要将位于后面的高额电影票移至前方。于是一开始考虑到的当然是移动策略。不过模拟整个移动过程变得极其复杂。突然想到最优策略完全可以用于判断在一定票数内能否达到营业额,然后利用二分的思路逼近最终答案。

想到这里,一切浮出水面,策略就相对简单了,分类讨论

1.若a、b位置相同,二分都不需要了,只有一种票价,直接卖就好了

2.若a、b位置不同,那么当然现卖a、b重合的位置了,(一定要注意:a、b重合的位置不为a*b,二是lcm(a,b)=a*b/gcd(a,b)

     2.1若a、b有重合的位置,则先将高额票放这些位置出售

     2.2出售完(或者没有)重合位置的票后,再依次出售a、b位置中的高价票,若两票价相同,则按顺序出售即可

/*
Author Owen_Q
*/

#include 

using namespace std;

typedef long long ll;

const int maxn = 2e5+5;

int p[maxn];

int a,b,x,y;
ll k;

bool check(int n)
{
    //int pp[maxn];
    ll sum = 0;
    int now,pos=0;
    if(ll(a) * ll(b) / ll(__gcd(a,b))<=ll(n))
    {
        int lcm = a / __gcd(a,b) * b;
        for(now=lcm;now<=n;now+=lcm)
        {
            sum += ll(p[pos++]/100*(x+y));
            //cout << sum << "#" << endl;
            if(sum>=k)
                break;
            //cout << pp[now] << "*" << endl;
            //cout << sum <0&&(now%a==0||now%b==0))
                    sum +=ll(p[pos++]/100*x);
                //cout << sum <=k)
                    break;
            }
        }
        else
        {
            if(x0)
                {
                    sum += ll(p[pos++]/100*x);
                    if(sum>=k)
                        break;
                }
                //cout << sum <0)
                {
                    sum += ll(p[pos++]/100*y);
                    if(sum>=k)
                        break;
                }
                //cout << sum <=k)
                        break;
                }
            }
        }
        else
        {
            if(x=k)
                    break;
            }
            for(now=b;now<=n;now+=b)
            {
                sum += ll(p[pos++]/100*y);
                if(sum>=k)
                    break;
            }
        }
    }
    if(sum>=k)
        return true;
    else
        return false;
}

int main()
{
    int q;
    //freopen("in.txt","r",stdin);
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    scanf("%d",&q);
    while(q--)
    {
        int n;
        scanf("%d",&n);
        for(int i=0;iC. Save the Nature());
        scanf("%d%d%d%d",&x,&a,&y,&b);
        scanf("%I64d",&k);
        if(a==b)
        {
            ll sum = 0;
            int now,pos;
            for(now=a,pos=0;now<=n;now+=a,pos++)
            {
                sum+=ll(p[pos]/100*(x+y));
                //cout << sum <=k)
                    break;
            }
            if(now<=n)
                printf("%d\n",now);
            else
                printf("%d\n",-1);
        }
        else
        {
            int st = 1, en = n;
            //cout << st << "*" << en << "*" << check(n) << endl;
            if(!check(n))
                printf("-1\n");
            else
            {
                while(st

 

你可能感兴趣的:(cf,二分,水题)