班级比赛题解

第一题 :传送门
题意:把每个月银行账户余额加起来除以12

//ac代码
#include<cstdio>
using namespace std;
int main()
{
    double x;
    double re=0;
    for(int i=1;i<=12;i++){
        scanf("%lf",&x);
        re+=x;
    }
    printf("$%.2lf\n",re/12);
}

第二题 传送门
老师原题,测测你们有没有认真补题

 //ac代码
#include<iostream>
using namespace std;
const int maxn=1e3+5;
int pre[maxn];
int _find(int x)
{
    return x==pre[x]?x:pre[x]=_find(pre[x]);
}
int main()
{
    int n,m;
    while(cin>>n&&n){
            cin>>m;
        for(int i=1;i<=n;i++){
            pre[i]=i;
        }
        int a,b;
        for(int i=1;i<=m;i++){
            cin>>a>>b;
            int rt1=_find(a);
            int rt2=_find(b);
            if(rt1!=rt2){
                pre[rt2]=rt1;
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            if(i==pre[i]){
                ans++;
            }
        }
        cout<<ans-1<<endl;
    }
    return 0;
}

第三题 传送门
题意:找最大值和最小值

#include<iostream>
#include<string>
using namespace std;
const int maxn=1e5+5;
struct node{
    string id;
    string zs;
    string ws;
}e[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;cin>>n;
        for(int i=0;i<n;i++){
            cin>>e[i].id>>e[i].zs>>e[i].ws;
        }
        int a=0,b=0;
        for(int i=0;i<n;i++){
            if(e[i].zs<=e[a].zs){
                a=i;
            }
            if(e[i].ws>=e[b].ws){
                b=i;
            }
        }
        cout<<e[a].id<<" "<<e[b].id<<endl;
    }
    return 0;
}

第四题
题意:用数学语言来讲就是判断二个集合是否相同
暴力解法

//ac代码
 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e2+5;
int main()
{
    int n;
    while(~scanf("%d",&n)){
        int num1[maxn];
        int num2[maxn];
        int r1[maxn];
        int r2[maxn];
        for(int i=0;i<n;i++){
            cin>>num1[i];
        }
        sort(num1,num1+n);
        int ans=0,ct=0;
        num1[n]=0;
        for(int i=0;i<n;i++){
            if(num1[i]!=num1[i+1]){
                r1[ans++]=num1[i];
            }
        }
        for(int i=0;i<n;i++){
            cin>>num2[i];
        }
        sort(num2,num2+n);
        num2[n]=0;
        for(int i=0;i<n;i++){
            if(num2[i]!=num2[i+1]){
                r2[ct++]=num2[i];
            }
        }
        int flag=1;
        if(ct==ans){
            for(int i=0;i<ans;i++){
                if(r1[i]!=r2[i]){
                    flag=0;break;
                }
            }
            if(flag){
                cout<<"YES"<<endl;
            }else cout<<"NO"<<endl;
        }else cout<<"NO"<<endl;
    }
    return 0;
}

技巧解法

#include<iostream>
#include<set>
#include<cstdio>
using namespace std;
int main()
{
    int  n;
    while(~scanf("%d",&n)){
        set<int>s1;
        set<int>s2;
        int a;
        for(int i=0;i<n;i++){
           cin>>a;
           s1.insert(a);
        }
        for(int i=0;i<n;i++){
           cin>>a;
           s2.insert(a);
        }
        if(s1.size()!=s2.size()){
            cout<<"NO"<<endl;
        }else{
           int temp=s2.size();
           for(set<int>::iterator it=s1.begin();it!=s1.end();it++){
                s2.insert(*it);
           }
           if(temp==s2.size()){
            cout<<"YES"<<endl;
           }else cout<<"NO"<<endl;
        }
    }
    return 0;
}

第五题 传送门
a+b问题
emmm注意格式问题

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e3+5;
int main()
{
    int t;
    int num1[maxn],num2[maxn];
    int ans=0;
    scanf("%d",&t);
    while(t--){
        char ch1[maxn];
        char ch2[maxn];
        if(ans)printf("\n\n");
        memset(num1,0,sizeof(num1));
        memset(num2,0,sizeof(num2));
        scanf("%s %s",ch1,ch2);
        printf("Case %d:\n",++ans);
        printf("%s + %s = ",ch1,ch2);
        int len1=strlen(ch1);
        int len2=strlen(ch2);
        for(int i=0;i<len1;i++){
            num1[i]=ch1[len1-i-1]-'0';
        }
        for(int i=0;i<len2;i++){
            num2[i]=ch2[len2-i-1]-'0';
        }
        for(int i=0;i<len2;i++){
            num1[i]+=num2[i];
            if(num1[i]>=10){
                num1[i]-=10;
                num1[i+1]++;
            }
        }
        int len=maxn-1;
        while(num1[len]==0&&len>=0)len--;
        if(len==-1)printf("0");
        else{
        for(int i=len;i>=0;i--){
            printf("%d",num1[i]);
        }
        }
    }
    printf("\n");
    return 0;
}

第六题 传送门
本题为我们刚刚所学最小生成树问题
prim算法实现

#include<iostream>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e2+5;
int mp[maxn][maxn];
int dis[maxn],vit[maxn];
int n,m;
int main()
{
    while(cin>>n>>m&&n){
       for(int i=1;i<=m;i++){
        for(int j=1;j<=m;j++){
            if(i!=j)mp[i][j]=inf;
            else mp[i][j]=0;
        }
       }
       int a,b,c;
       for(int i=1;i<=n;i++){
        cin>>a>>b>>c;
        if(c<mp[a][b]){
            mp[a][b]=c;
            mp[b][a]=c;
        }
       }
       for(int i=1;i<=m;i++){
         dis[i]=mp[1][i];
         vit[i]=0;
       }
       vit[1]=1;
       int minn,p=-1;
       int ans=0,re=0;
       for(int i=1;i<=m-1;i++){
           minn=inf;p=-1;
          for(int j=1;j<=m;j++){
            if(dis[j]<minn&&!vit[j]){
                minn=dis[j];
                p=j;
            }
        }
        if(p==-1){
            ans=1;
            break;
        }
            vit[p]=1;
            re+=dis[p];
            for(int k=1;k<=m;k++){
                if(dis[k]>mp[p][k]&&!vit[k]){
                    dis[k]=mp[p][k];
                }
            }
        }
        if(!ans){
            cout<<re<<endl;
        }else cout<<'?'<<endl;
       }
    return 0;
}

第七题 传送门
并查集+模拟综合题
重点在Reject与Accept的判断,根据题目第三、四段的描述可知
Accept情况是这个公司还存在,并非名存实亡

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
int num[maxn];
int pre[maxn];
int _find(int x)
{
    return x==pre[x]?x:pre[x]=_find(pre[x]);
}
void join(int x,int y)
{
    int rt1=_find(x);
    int rt2=_find(y);
    if(rt1!=rt2){
        pre[rt2]=rt1;
        _find(y);
    }
    return ;
}
int main()
{
    int n,k,m;
    string str;
    int x,y;
    while(cin>>n>>k>>m){
    for(int i=0;i<n;i++){
        pre[i]=i;
        num[i]=inf;
    }
    int a,b;
    for(int i=1;i<=k;i++){
            cin>>a>>b;
            num[b]=min(num[b],a);
    }
    for(int i=1;i<=m;i++){
       cin>>str;
       if(str=="AP"){
        cin>>x>>y;
        if(_find(y)==y){
        printf("Accept\n");
        num[y]=min(num[y],x);
        }else  printf("Reject\n");
       }else if(str=="MG"){
          cin>>x>>y;
          if(x==_find(x)&&y==_find(y)&&x!=y){
          printf("Accept\n");
          join(x,y);
           num[x]=min(num[x],num[y]);
           num[y]=inf;
         }else  printf("Reject\n");
       }else if(str=="GT"){
            cin>>x;
            int rt=_find(x);
            if(rt==x){
                if(num[x]!=inf){
                    printf("Lowest rate: %d.\n",num[x]);
                }else{
                  printf("Company %d is empty.\n",x);
                }
            }else{
               printf("Company %d is a part of company %d.\n",x,rt);
            }
       }
    }
    printf("\n");
    }
    return 0;
}

如有不对的地方,欢迎大家指正!!!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值