Contest RankList -- 2021ACM俱乐部后备营个人训练赛第15场

Contest RankList – 2021ACM俱乐部后备营个人训练赛第15场

问题 A: 校门外的树

Solution

数组+标记就行了。但是这里不得不吐槽,中石油的这个题居然把 3 2 ,这不合法情况都算,在洛谷上的同样的题就不必考虑这种情况。这可能就是为啥大家都是WA了很多次才过的原因叭,害(我WA了三次,麻了)。
在这里插入图片描述

Code

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
 
int main()
{
    
    
    int i,j,m,l,sum=0;
    int a[10001],start,ending;
     cin>>l>>m;
    for(i=0;i<=l;i++)
        a[i]=1;
    for(i=0;i<m;i++)
    {
    
    
        cin>>start>>ending;
        if(start<ending){
    
    
            for(j=start;j<=ending;j++)
                if(a[j]==1)
                    a[j]=0;
        }
        else
        {
    
    
            for(j=ending;j<=start;j++)
                if(a[j]==1)
                    a[j]=0;
        }
    }
    for(i=0;i<=l;i++)
        if(a[i]==1)
            sum++;
    cout<<sum<<endl;
    return 0;
}

问题 B: 陶陶摘苹果

Solution

水题。

Code

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    
    
    int n,a[10];
    int count=0;
    for(int i=0;i<10;++i)
        cin>>a[i];
    cin>>n;
    for(int i=0;i<10;++i)
    {
    
    
        if(n+30>=a[i])
            ++count;
    }
    cout<<count;
    return 0;
}

问题 C: 采药

Solution

动态规划,01背包。

Code

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
 
int main()
{
    
    
    int n,m,B[1000],v[1000],w[1000];
    int i,j;
    memset(B,0,sizeof(B));//清零
    cin>>n>>m;
    for(i=0; i<m; i++)
    {
    
    
        cin>>w[i]>>v[i];//采摘草药时间和草药价值
    }
    for(i=0; i<m; i++)
    {
    
    
        for(j=n; j>=0; j--)
        {
    
    
            if(B[j]<=B[j-w[i]]+v[i] && j-w[i]>=0 )
            {
    
    
                B[j]=B[j-w[i]]+v[i];
            }
 
        }
    }
    cout<<B[n];
    return 0;
}

问题 E: AtCoDeer and Paint Cans

Solution

水题,数组+sort+unique。不会这两个函数的去看—>常用函数(持续更新)

Code

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    
    
    int a[3];
    for(int i=0;i<3;++i)
        cin>>a[i];
    sort(a,a+3);
    int cnt = unique(a,a+3)-a;
    cout<<cnt;
    return 0;
}

问题 F: Painting Balls with AtCoDeer

Solution

水题,你列举几种情况就能明白规律。

规律:当有两种颜色时,无论多少个球,都是两种情况;当颜色数目大于两种,情况就有(颜色数*(颜色数-1)的(球数量-1)平方)种。

Code

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    
    
    int n,k,ans=0;
    cin>>n>>k;
    if(k==2)
    {
    
    
        ans=2;
        cout<<ans;
        return 0;
    }
    else
    {
    
    
        ans = k*pow(k-1,n-1);
        cout<<ans;
        return 0;
    }
}

问题 H: AtCoDeer and Rock-Paper

Solution

模拟,你可以假设一下全部都是石头的情况,再想,就比较好懂。

Code

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    
    
    string s;
    cin>>s;
    int p=0,ans=0;
    for(int i=0;i<s.length();++i)
    {
    
    
        if(s[i]=='g')
        {
    
    
            if(p>0)
            {
    
    
                ++ans;
                --p;
            }
            else
                ++p;
        }
        else
        {
    
    
            if(p>0)
                --p;
            else
            {
    
    
                ++p;
                --ans;
            }
        }
    }
    cout<<ans;
    return 0;
}

问题 G: AtCoDeer and Election Report

Solution

题意:每次给出一个比例,要求两个数在不能减少的基础上,以为最小的变化形成这个比例.

让上一次的 x,y 进行:x/y=n*(a/b) (a,b就是题目中的T和A),这里需要求的是n最小能取多少。

可以选择从1开始枚举直到 n * a>=x&&n * b>=y。BUT,如果你这样做,你就是TLE小宝贝。

所以,可以直接让 n=max(x/a,y/b) ,再判断一下n * a与x大小,n * b与y的大小就行.

Code

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
 
int main()
{
    
    
    ll n,t;
    ll a,b;
    ll x=1,y=1;
    cin>>t;
    while(t--)
    {
    
    
        cin>>a>>b;
        n = max(x/a,y/b);
        while(n*a<x || n*b<y)
            ++n;
        x = a*n;
        y = b*n;
    }
    cout<<x+y;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_51344172/article/details/113397194