ACM暑期集训30

组队训练赛第二场

题目连接传送门

B. Boss Battle

当n≤3时显然1步就可以炸死。否则每次可以缩小一格,故答案为n−2。

#include<stdio.h>
int main()
{
 int t;
 scanf("%d",&t);
 if(t<=3) printf("1\n");
 else printf("%d\n",t-2);
}

D. Dunglish

按题意模拟(correct是可以取0的,做的时候一直把他归为另一类,WA了十几发)

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
using namespace std;

typedef long long ll;

int main()
{
    int n;
    vector<string> st;
    string str[25];
    set<string> ss;
    map<string,int> a;
    map<string,int> b;
    map<string,int> c;
    map<string,string> ma1;
    map<string,string> ma2;
    ma2.clear();
    ma1.clear();
    c.clear();
    a.clear();
    a.clear();
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        string s;
        cin>>s;
        if(!a.count(s)) a[s]=0;
        a[s]++;
        if(!ss.count(s)) {
            st.push_back(s);
            ss.insert(s);
        }
        str[i]=s;
    }
    int m;
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        string s1,s2,s3;
        cin>>s1>>s2>>s3;
        if(s3[0]=='c') {
            if(!b.count(s1)) b[s1]=0;
            b[s1]++;
            ma2[s1]=s2;
        }
        if(s3[0]=='i') {
            if(!c.count(s1)) c[s1]=0;
            c[s1]++;
            ma1[s1]=s2;
        }
    }
    int flag=1;
    unsigned long long ans1=1,ans2=1;
    for(int i=0;i<st.size();i++)
    {
        int p,q,r;
        string s=st[i];
        if(!b.count(s)) p=0;
        else p=b[s];
        if(!c.count(s)) r=0;
        else r=c[s];
        q=a[s];
        for(int j=1;j<=q;j++)
        {
            ans2=ans2*(p+r);
        }
    }
    for(int i=0;i<st.size();i++)
    {
        int p,q;
        string s=st[i];
        if(!b.count(s)) p=0;
        else p=b[s];
        if(!c.count(s)) q=0;
        else q=c[s];
        if((p+q)>=2) flag=2;
    }

    for(int i=0;i<st.size();i++)
    {
        string s=st[i];
        if(flag!=2&&!b.count(s)) flag=0;
    }

    for(int i=0;i<st.size();i++)
    {
        int p;
        string s=st[i];
        if(!b.count(s)) {
            ans1=0;
            break;
        }
        p=b[s];
        int q=a[s];
        for(int j=1;j<=q;j++)
            ans1=ans1*p;
    }

    if(flag==0)
    {
        for(int i=1;i<=n;i++)
        {
            if(ma1.count(str[i])) cout<<ma1[str[i]];
            else cout<<ma2[str[i]];
            if(i!=n) printf(" ");
        }
        printf("\n");
        printf("incorrect\n");
    }
    else if (flag==1) {
        for(int i=1;i<=n;i++)
        {
            cout<<ma2[str[i]];
            if(i!=n) printf(" ");
        }
        printf("\n");
        printf("correct\n");
    }
    else {
       cout<<ans1<<" correct"<<endl;
        cout<<ans2-ans1<<" incorrect"<<endl;
    }
    return 0;
}

H. High Score

因为平方增长较快,所以全部给某个数是最优的,但在小数据下不一定成立,故小数据暴力枚举即可。

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int K=1000;
int T;ll a,b,c,d,i,j,k,ans;
inline ll cal(ll a,ll b,ll c){return a*a+b*b+c*c+min(a,min(b,c))*7;}
int main(){
    cin>>T;
    while(T--){
        cin>>a>>b>>c>>d;
        ans=0;
        for(i=0;i<=d&&i<=K;i++)for(j=0;i+j<=d&&j<=K;j++){
            k=d-i-j;
            ans=max(ans,cal(a+i,b+j,c+k));
            ans=max(ans,cal(a+i,b+k,c+j));
            ans=max(ans,cal(a+k,b+i,c+j));
        }
        ans=max(ans,cal(a+d,b,c));
        ans=max(ans,cal(a,b+d,c));
        ans=max(ans,cal(a,b,c+d));
        cout<<ans<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41383801/article/details/82155548