电子科技大学实验中学PK赛(三)-期末测试比赛题解
比赛地址:http://qscoj.cn/contest/33/
A题 国家德比
分析:用b,d,B,D记录两场比赛两支球队的比分,先判断b+B与d+D的大小,如果先者大则拜仁胜,后者大则多特胜;相同再判断B与d的大小,前者大拜仁胜,后者大多特胜,相同则加时。
标程:
#include<bits/stdc++.h> using namespace std; int main() { int b,d,B,D; cin>>b>>d; cin>>B>>D; if (b+B>d+D) cout<<"FC Bayern Munich"<<endl; if (b+B<d+D) cout<<"Borussia Dortmund"<<endl; if (b+B==d+D) { if (B>d) cout<<"FC Bayern Munich"<<endl; if (B<d) cout<<"Borussia Dortmund"<<endl; if (B==d) cout<<"Overtime"<<endl; } return 0; }
B题 圆圈统计
分析:一共27个韩文字,只需一个个数出每个韩文字圆圈数量存在一个数组a中,将三十六进制数转化为十进制,再从a[l]累加到a[r]就行。
标程:
#include<bits/stdc++.h> using namespace std; int a[28]={0,1,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,2,1,1,1,0,0,1,1,1,1}; int main() { string s1,s2; int l,r,i,ans; cin>>s1>>s2;ans=0; if (s1[0]<=57) l=s1[0]-48; else l=s1[0]-55; if (s2[0]<=57) r=s2[0]-48; else r=s2[0]-55; for(i=l;i<=r;i++) ans+=a[i]; cout<<ans<<endl; return 0; }
C题 飞镖游戏
分析:通过题意可以分析出,最后一镖能投的分数为2-40的偶数和50,之前的每镖能投的分数为1-20,2-40的偶数,3-60中3的倍数,25,50。所以把这些能投中的分数放在一个vector数组中,倒回去DP。先把所有dp值赋为-1,把2-40和50的dp值赋为1;之后再依次更新下一步能投中的分数总和,dp[i]=min(dp[i-v[j]])+1;v[j]为1镖能投中的分数。注意x为1时无论如何都无法达到该分数,则应输出-1.
标程:
#include<bits/stdc++.h> using namespace std; int dp[510]; vector<int> v; int main() { int x,i,j,k,minx; bool flag; cin>>x; memset(dp,-1,sizeof(dp)); for(i=1;i<=20;i++) { v.push_back(i); v.push_back(2*i); v.push_back(3*i); } v.push_back(25); v.push_back(50); for(i=1;i<=20;i++) dp[2*i]=1; dp[50]=-1;flag=true; while(flag) { flag=false; for(i=2;i<=501;i++) { if (dp[i]!=-1) continue; flag=true;minx=0x3f3f3f3f; for(j=0;j<v.size();j++) { k=i-v[j]; if (k>=2 && dp[k]!=-1) minx=min(minx,dp[k]); } dp[i]=minx+1; } } cout<<dp[x]<<endl; return 0; }