2021年度训练联盟热身训练赛第三场
A.Circuit Math
题意:模拟数字电路的与或非运算,*是与,+是或,-是非
题解:利用栈计算,将值放入栈中,遇到* + 弹出两个值计算,遇到 - 弹出一个,再将得到的值推进栈
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<stack> #include<map> using namespace std; typedef long long ll; stack<char>s1,s2; map<char,char>mp; char answer(char a,char b,char op){ if(op=='*'){ if(a=='T'&&b=='T'){ return 'T'; } return 'F'; }else if(op=='+'){ if(a=='T'||b=='T'){ return 'T'; }else{ return 'F'; } } return 'F'; } char a[28]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } char c; int cnt=0,flag=0; getchar(); while(cin.get(c)&&c!='\n'){ if(c<='Z'&&c>='A'){ if(!mp.count(c)){ cnt++; mp[c]=a[cnt]; } s1.push(mp[c]); } char t1,t2,ans; if(c=='*'||c=='+'){ t1=s1.top(); s1.pop(); t2=s1.top(); s1.pop(); ans=answer(t1,t2,c); s1.push(ans); }else if(c=='-'){ t1=s1.top(); s1.pop(); if(t1=='T'){ ans='F'; }else{ ans='T'; } s1.push(ans); } } cout<<s1.top()<<endl; return 0; }
B.Diagonal Cut
题意:有一大块巧克力由m*n块小巧克力组成,把巧克力从左上角到右下角能讲多少小块巧克力化成相等的两块
题解:以左下角建立坐标轴,得对角线函数y=(m/n)x,设左下角点为(p,q),则小正方形的中心有(p+1/2,q+1/2),带入对角线函数得q+1/2=(m/n)*(p+1/2),化简后得2q+1=(M/N)*(2p+1),M=m/gcd(m,n),N=n/gcd(m,n)当且仅当M和N同时为奇数时有解
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; ll gcd(ll a,ll b){ if(!b){ return a; }else{ return gcd(b,a%b); } } int main(){ ll m,n; cin>>m>>n; ll t=gcd(m,n); m=m/t,n=n/t; if(m%2&&n%2){ cout<<t<<endl; }else{ cout<<0<<endl; } return 0; }
C.Gerrymandering
题意:给定选区和每个选区的政党选票总数,确定在每个选区获胜的政党。最后,计算所有地区的效率差距。
题解:把每个地区A和B的票数相加。将所有选票相加后,计算每个政党选区浪费的选票,并报告它们将A和B的浪费票数相加,根据问题中给出的公式计算效率差距按照题意(当时一直以为自己题意读错了,没发现自己代码有个地方把y敲成x了 /(ㄒoㄒ)/~~)
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<stack> #include<map> using namespace std; typedef long long ll; struct node{ ll x; ll y; }area[10010]; int main(){ int p,d; cin>>p>>d; ll a,b,c; ll sum=0,sum1=0,sum2=0,t=0; for(int i=1;i<=p;i++){ cin>>a>>b>>c; area[a].x+=b; area[a].y+=c; sum+=b+c; } for(int i=1;i<=d;i++){ if(area[i].x>area[i].y){ t=area[i].x-((area[i].x+area[i].y)/2+1); sum1+=t; sum2+=area[i].y; cout<<"A "<<t<<" "<<area[i].y<<endl; }else{ t=area[i].y-((area[i].x+area[i].y)/2+1); sum1+=area[i].x; sum2+=t; cout<<"B "<<area[i].x<<" "<<t<<endl; } } double ans=0; ans=abs(sum1-sum2)*1.0/sum*1.0; printf("%.10f",ans); return 0; }
D.Missing Numbers
#include<algorithm> #include<iostream> #include<cstdio> using namespace std; int a[220]; int main(){ int n; cin>>n; int x; for(int i=1;i<=n;i++){ cin>>x; a[x]=1; } int flag=0; for(int i=1;i<=x;i++){ if(!a[i]){ cout<<i<<endl; flag=1; } } if(!flag){ cout<<"good job"<<endl; } return 0; }
K.Summer Trip
题意:给一个字符串,每个字符代表一个行程,选一段连续的子字符串,使满足头尾的行程唯一出现过。求有多少满足条件
题解:枚举,当cnt>26可以结束因为再往后就会有重复的,a[i]=a[j]时结束,因为再往下就不满足头尾不一样了
#include<algorithm> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<set> using namespace std; int a[26]; int main(){ string s; cin>>s; int sum=0,cnt=0; for(int i=0;i<s.length();i++){ cnt=1; memset(a,0,sizeof(a)); for(int j=i+1;j<s.length();j++){ if(s[i]==s[j]||cnt>26){ break; } if(!a[s[j]-'a']){ a[s[j]-'a']=1; sum++; cnt++; } } } cout<<sum<<endl; return 0; }

浙公网安备 33010602011771号