TeacherMa专场题解

比赛地址
A 不讲武德
思路:高精度加法,java大数类应用

import java.util.*;
import java.lang.*;
import java.math.*;

public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int t=in.nextInt();
        for(int i=0;i<t;i++){
            BigInteger a=in.nextBigInteger();
            BigInteger b=in.nextBigInteger();
            BigInteger c=in.nextBigInteger();
            b=b.add(c);
            if(a.compareTo(b)>0)System.out.println("Yes");
            else System.out.println("No");   
        }
    } 
}

C 点到为止

#include<iostream>
#include<string>
#include<cstring>

using namespace std;

int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        if(n==3||n==9||n==15)puts("Xiao Huo Zi");
        else puts("Teacher Ma");
    }
    return 0;
}

D 混元功法
思路:简单并查集维护,只要输出对应集合的元素个数即可

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>

using namespace std;

const int N=1e3+10;
int root[N],num[N],id[N],a[N];

void Init(int n)
{
    for(int i=1;i<=n;i++)root[i]=i,num[i]=1;
}

int Find(int x)
{
    return x==root[x]?x:Find(root[x]);
}

void Union(int x,int y)
{
    x=Find(x),y=Find(y);//比赛的时候这儿写错了,写成了x=root[x],y=root[y],一直wa。。。。
    if(x!=y){
        root[y]=x;
        num[x]+=num[y];
    }
}

int main()
{
    int n,x,y;
    cin>>n;
    Init(n);
    for(int i=1;i<=n;i++){
        cin>>x>>y;
        id[i]=x;//因为第i个健身房对应的x不一定是i,因此需要一个数组来存下第i个健身房的x坐标
        //使其指向x,再用a[x]=y存下对应的y坐标
        a[x]=y;
    }
    //因为x坐标是n排列,所以可以直接让x从1开始枚举,这个时候x坐标一定是从小到大的,可以保证xi<xj,所以
    //此时只要判断y坐标大小关系即可
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(i==j)continue;
            if(a[i]<a[j]){
                Union(i,j);
            }
        }
    }
    for(int i=1;i<=n;i++)cout<<num[Find(id[i])]<<endl;
    return 0;
}

F 松果弹抖散颠鞭
思路:贪心

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<algorithm>

using namespace std;

int main()
{
    string s;
    cin>>s;
    bool tp1=false,tp2=false,tp3=false;
    string sb="";
    int ans=1000010;
    int a1,a2,a3;
    for(int i=0;i<s.size();i++){
        if(s[i]=='1'){
            a1=i;
            tp1=true;
        }
        if(s[i]=='2'){
            a2=i;
            tp2=true;
        }
        if(s[i]=='3'){
            a3=i;
            tp3=true;
        }
        if(tp1&&tp2&&tp3){
            int _min=min(min(a1,a2),a3);
            int _max=max(max(a1,a2),a3);
            if(_min==a1)tp1=false;
            else if(_min==a2)tp2=false;
            else tp3=false;
            ans=min(ans,_max-_min+1);
        }
    }
    if(ans==1000010)ans=0;
    cout<<ans<<endl;
    return 0;
}

H 闪电五连鞭
思路:思维,直接求,每个人想要当农民的总桌数除以除以每局除了地主以外的农民数可以得到平均每个人至少要玩多少局才行,但是同时又得保证局数最多的人必须得满足,因此最后取一下ans

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<limits.h>

using namespace std;

typedef long long ll;
const int N=1e5+10;
int a[N];

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    ll sum=0;
    int mx=INT_MIN;
    for(int i=0;i<n;i++){
        sum+=a[i];
        mx=max(mx,a[i]);
    }
    int ans=sum/(n-1);//所有人想要当农民的总局数除以当前除了地主以外的农民的总数得到的是平均桌数
    if(sum%(n-1))ans++;
    ans=max(ans,mx);//保证当ans小于mx的时候取大的因为至少要让桌数最多的农民满足情况
    cout<<ans<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值