2021年度训练联盟热身训练赛第二场

A.Binarize It

题意:给n个数输出大于或等于这个数的的2的次方

#include<algorithm> 
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<sstream>
#include<map>
#include<cmath>
using namespace std;
int main(){
    int n;
    cin>>n;
    int num;
    while(n--){
        cin>>num;
        cout<<"Input value: "<<num<<endl;
        int sum=1;
        for(int i=1;;i++){
            sum=sum*2;
            if(sum>=num){
                cout<<sum<<endl<<endl;
                break;
            }
        }
    } 
    return 0;
}

 

B.g2g c u l8r

题意:先给出n个缩写和它代表的信息,再给m行信息,输出这行完整的信息

题解:模拟(find()成功返回迭代器指向要查找的元素,失败返回的迭代器指向end。count()找到返回1m没找到返回0)

#include<algorithm> 
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<sstream>
#include<map>
using namespace std;
map<string,string>mp;
map<string,string> ::iterator it;
int main(){
    int n,m;
    cin>>n;
    string s1,s2;
    for(int i=1;i<=n;i++){
        cin>>s1;
        getchar();
        getline(cin,s2); 
        mp[s1]=s2;
    }
    cin>>m;
    getchar();
    string s,ts;
    stringstream ss;
    for(int i=1;i<=m;i++){
        stringstream ss;
        getline(cin,s);
        ss<<s;
        while(ss>>ts){
            int flag=0;
        /*    for(it=mp.begin();it!=mp.end();it++){
                if(ts==it->first){
                    flag=1;
                }
            }
            if(flag){
                cout<<mp[ts]<<" ";
            }else{
                cout<<ts<<" ";
            }
        */
             if(mp.count(ts)){
                cout<<mp[ts]<<" ";
            }else{
                cout<<ts<<" ";
            }
        }
        cout<<endl;
    }
}

C.Tip to be Palindrome

题意:给定一个金额,金额*0.2等于小费,小费小数部分要四舍五入,小费+金额=总账目,输出各金额的小费和总账目,如果总账目是回文数直接输出,否则增加小费使总帐目变成最小的回文数

题解:最大值10,000满足题意的小费为12,021 对所有输入向上枚举到12,021输出答案

#include<algorithm> 
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<sstream>
#include<map>
#include<cmath>
using namespace std;
int main(){
    int n,tip,num;
    cin>>n;
    while(n--){
        cin>>num;
        int tip=ceil(num*0.2);
        for(int i=num+tip;i<13000;i++){
            int t,pnum=0;
            t=i;
            while(t){
                pnum=pnum*10+t%10;
                t=t/10;
            }
            if(pnum==i){
                cout<<"Input cost: "<<num<<endl;
                cout<<i-num<<" "<<i<<endl<<endl;
                break;
            }
        }
    }
    return 0;
}

 

D.Soccer Standings

题意:有n个测试样例;第一行给g,t,表示一共有t个球队共进行了g场比赛,下一行给这t个球队的名字,接下来g行给出<country_1>  <score_1>  <country_2>  <score_2>,表示对战球队的名字姓名,胜得一方得三分,输的一方不得分,平局双反都得两分。按规定的排序方式输出每个球队的<name>  <points> <wins>  <losses>  <draws>  <goals  scored>  <goals  allowed>,

题解:利用结构体

#include<algorithm> 
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<sstream>
#include<map>
using namespace std;
struct node{
    string name;
    int points;
    int wins;
    int losses;
    int draws;
    int gs;
    int ga;
}a[35];
bool cmp(node a,node b){    
    if(a.points==b.points){
        if(a.gs-a.ga==b.gs-b.ga){
            if(a.gs==b.gs){
                return a.name<b.name;
            }
            return a.gs>b.gs;
        }
        return a.gs-a.ga>b.gs-b.ga;
    }
    return a.points>b.points;
}
int main(){
    int n;
    cin>>n;
    int t,g;
    string s1,s2;
    int c1=0,c2=0;
    for(int test=1;test<=n;test++){
        cin>>t>>g;
        for(int i=0;i<t;i++){
            cin>>a[i].name;
            a[i].ga=0,a[i].gs=0,a[i].points=0;
            a[i].losses=0,a[i].wins=0,a[i].draws=0;
        }
        int flag1=0,flag2=0;
        for(int i=0;i<g;i++){
            cin>>s1>>c1>>s2>>c2;
            flag1=0,flag2=0;
            for(int j=0;j<t;j++){
                if(a[j].name==s1){
                    a[j].gs+=c1;
                    a[j].ga+=c2;
                    if(c1>c2){
                        a[j].wins+=1;
                        a[j].points+=3;
                    }else if(c1<c2){
                        a[j].losses+=1;
                    }else{
                        a[j].draws+=1;
                        a[j].points+=1;
                    }
                    flag1=1;
                }
                if(a[j].name==s2){
                    a[j].gs+=c2;
                    a[j].ga+=c1;
                    if(c2>c1){
                        a[j].wins+=1;
                        a[j].points+=3;
                    }else if(c2<c1){
                        a[j].losses+=1;
                    }else{
                        a[j].draws+=1;
                        a[j].points+=1;
                    }
                    flag2=1;
                }
                if(flag1&&flag2){
                    break;
                }
            }
        }
        sort(a,a+t,cmp);
        cout<<"Group "<<test<<":"<<endl;
        for(int i=0;i<t;i++){
            cout<<a[i].name<<" "<<a[i].points<<" "<<a[i].wins<<" "
            <<a[i].losses<<" "<<a[i].draws<<" "<<a[i].gs<<" "<<a[i].ga<<endl;
        }
        cout<<endl;
    }
}

 E.NIH Budget

题意:有n组预算需要考虑。每组第一行给出病例数d,总预算b,接下来d行给出每种病例的四种治疗方案(花费和能救的人数),每种病例的治疗方案最多只能选一个,求在总预算b内所能救得最大人数。

题解:有d组物品,每组4种,有一个容量为b的背包,每组物品中最多选一个,求背包所能放的最大价值;

#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
#define MAXN 1000010
int money[11][5],people[11][5];
int dp[MAXN];
int main(){
    int n;
    cin>>n;
    for(int test=1;test<=n;test++){
        memset(money,0,sizeof(money));
        memset(people,0,sizeof(people));
        memset(dp,0,sizeof(dp));
        int d,b;
        cin>>d>>b;
        for(int i=0;i<d;i++){
            for(int j=0;j<4;j++){
                cin>>money[i][j]>>people[i][j];
            }
        }
        for(int i=0;i<d;i++){
            for(int j=b;j>=0;j--){
                for(int k=0;k<4;k++){
                    if(j<money[i][k]){
                        dp[j]=max(dp[j],dp[j-1]);
                    }else{
                        dp[j]=max(dp[j],dp[j-money[i][k]]+people[i][k]);
                    }
                }
            }
        }
        cout<<"Budget #"<<test<<": Maximum of "<<dp[b]<<" lives saved."<<endl<<endl;
    }
        return 0;
} 

 

posted @ 2021-03-19 20:27  Endeavo_r  阅读(46)  评论(0)    收藏  举报