比赛地址
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;
}