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

打cf的過程中遭受到了DDOS攻擊,導致最終無法進行下去,也算是奇聞一件了

A. CME

思路:看似像個火柴遊戲,實則只是個判斷奇偶的水題

/*
Author Owen_Q
*/

#include <bits/stdc++.h>

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 <bits/stdc++.h>

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<len;i++)
        {
            num1[s[i]-'a']=true;
            num2[t[i]-'a']=true;
        }
        for(int i=0;i<26;i++)
            num[i] = num1[i] + num2[i];
        sort(num,num+26);
        //cout << num[0] << "*" << num[25] << endl;
        if(num[25]==2)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

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 <bits/stdc++.h>

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 <<endl;
        }
        if(x==y)
        {
            for(now=1;now<=n;now++)
            {
                if(now%lcm>0&&(now%a==0||now%b==0))
                    sum +=ll(p[pos++]/100*x);
                //cout << sum <<endl;
                if(sum>=k)
                    break;
            }
        }
        else
        {
            if(x<y)
            {
                swap(x,y);
                swap(a,b);
            }
            for(now=a;now<=n;now+=a)
            {
                if(now%lcm>0)
                {
                    sum += ll(p[pos++]/100*x);
                    if(sum>=k)
                        break;
                }
                //cout << sum <<endl;
            }
            for(now=b;now<=n;now+=b)
            {
                if(now%lcm>0)
                {
                    sum += ll(p[pos++]/100*y);
                    if(sum>=k)
                        break;
                }
                //cout << sum <<endl;
            }
        }
    }
    else
    {
        if(x==y)
        {
            for(now=1;now<=n;now++)
            {
                if(now%a==0||now%b==0)
                {
                    sum += ll(p[pos++]/100*x);
                    //cout << sum <<endl;
                    if(sum>=k)
                        break;
                }
            }
        }
        else
        {
            if(x<y)
            {
                swap(x,y);
                swap(a,b);
            }
            for(now=a;now<=n;now+=a)
            {
                sum += ll(p[pos++]/100*x);
                if(sum>=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<n;i++)    scanf("%d",&p[i]);
        sort(p,p+n,greater<int>());
        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 <<endl;
                if(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<en)
                {
                    int mid = (st + en)/2;
                    //cout << now << "*" << mid << "*" << st << "*" << en<< endl;
                    if(check(mid))
                        en = mid;
                    else
                        st = mid+1;
                    //cout << st << "*" << en << "*" << check(mid) << endl;
                }
                printf("%d\n",st);
            }
        }
    }
    return 0;
}


/*
分類討論過於複雜,考慮二分
*/
/*
細節
*/
/*
利用gcd判斷是否爲同時爲兩個數的倍數(lcm = a*b/gcd)
*/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章