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; }