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

 

posted @ 2021-03-26 18:06  Endeavo_r  阅读(41)  评论(0)    收藏  举报