本次比赛真的是打的稀烂,思路读完题就有了,自己细节不到位,调试了半天,WA了无数发,最后明明思路已经有了的E题没时间写,真的是太菜了,蒟蒻!
比赛链接
A
题意:
给你一个距离D,时间T,速度S,问是否可以在T时间内到达。
思路:
模拟比较即可。
AC代码:
#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include <string>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include<bits/stdc++.h>
#include <set>
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
#define pi 3.1415926535898
using namespace std;
const int N=2e5+10;
const int mod=1e9+7;
int a[N];
int main()
{
int t,d,x;
cin>>d>>t>>x;
if(t*x>=d)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
return 0;
}
B
题意:
给你两个字符串A,B,问A最少经过几次改变,B可以成为A的子串。
思路:
暴力枚举,求不同字符最少的。
AC代码:
#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include <string>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include<bits/stdc++.h>
#include <set>
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
#define pi 3.1415926535898
using namespace std;
const int N=2e5+10;
const int mod=1e9+7;
int main()
{
char a[3010],b[3010];
cin>>a>>b;
int n,m;
n=strlen(a);
m=strlen(b);
int sum=999999;
for(int i=0; i<n-m+1; i++)
{
int ans=0;
for(int j=0;j<m; j++)
{
if(a[i+j]!=b[j])
{
ans++;
}
}
sum=min(ans,sum);
}
cout<<sum<<endl;
return 0;
}
C
题意:
一个数列N,求所有AiAj的和,1<=i<j<=n;
思路:
根据题意,可以转化为Ai(Ai前面所有数的和)的和,
AC代码
#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include <string>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include<bits/stdc++.h>
#include <set>
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
#define pi 3.1415926535898
using namespace std;
const int N=2e5+10;
const int mod=1e9+7;
ll a[N];
ll b[N];
ll ans;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
ll x;
cin>>x;
b[i]=x;
a[i]=a[i-1]+x;//前缀和
}
for(int i=1;i<=n;i++)
{
ans=(ans+(b[i]*(a[i-1]%mod)%mod))%mod;//注意前缀和可能过1E9会炸LL
}
cout<<ans<<endl;
return 0;
}
D
题意:
现在有N个人,M个消息,每个消息是I,J为朋友关系,朋友关系是传递的,现在问,如何分组,才能使每组的人都不是朋友。
思路:
根据题意可知,这个题目是要你求朋友关系中,最多的人有多少个,这些人都不能在同一组,所以最多的组数是朋友关系最多的。
AC代码:
#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include <string>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include<bits/stdc++.h>
#include <set>
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
#define pi 3.1415926535898
using namespace std;
const int N=2e5+10;
const int mod=1e9+7;
ll f[N+1];
ll b[N+1];
ll finds(ll x)
{
if(f[x]!=x)
f[x]=finds(f[x]);
return f[x];
}
void uni(ll x,ll y)
{
ll x1=finds(x);
ll y1=finds(y);
ll a=min(x1,y1);
ll b=max(x1,y1);
f[b]=f[a];
}
int main()
{
for(int i=1; i<N; i++)
{
f[i]=i;
}
int n,m;
cin>>n>>m;
for(int i=0; i<m; i++)
{
int x,y;
cin>>x>>y;
uni(x,y);
}
ll maxs=-99999;
for(int i=1; i<=n; i++)
{
b[finds(i)]++;
}
for(int i=1; i<=n; i++)
{
maxs=max(maxs,b[i]);
}
cout<<maxs<<endl;
return 0;
}
E
题意:
给你一个数组,如果两两的GCD为1则输出pairwise coprime,如果所有数的GCD为1则输出setwise coprime,否则输出not coprime。
思路:
对每个数因式分解,并且统计他的因数,如果所有因数都只出现一次则代表所有数都两两互质输出pairwise coprime,如果有一个因数出现了N次则代表所有数的GCD不等于1输出not coprime,否则输出setwise coprime。
AC代码:
#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include <string>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include<bits/stdc++.h>
#include <set>
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
#define pi 3.1415926535898
using namespace std;
const int N=1e6+10;
const int mod=1e9+7;
using namespace std;
int boom[N];//记录因数
int primes[N];//保存质数
int cnt;
int st[N];
void ola(int n)//筛素数
{
for (int i = 2; i <= n; i ++ )
{
if (st[i] == 0) primes[cnt ++ ] = i;//将质数存到primes中
for (int j = 0; primes[j] <= n / i; j ++ )//要确保质数的第i倍是小于等于n的。
{
st[primes[j] * i] = 1;
if (i % primes[j] == 0) break;
}
}
}
int main()
{
ola(2000);
int n;cin>>n;
for(int i=0;i<n;i++)
{
int t;cin>>t;
for(int i=0;i<cnt;i++)//因式分解
{
int tot=0;
while(t%primes[i]==0)
{
t/=primes[i];
tot=1;
}
if(tot) boom[primes[i]]++;//保留因数
}
if(t>1) boom[t]++;
}
int st=0;
for(int i=1;i<1000005;i++)//统计因数的个数
{
if(boom[i]>=2) st++;
if(boom[i]==n)
{
cout<<"not coprime"<<endl;
return 0;
}
}
if(st==0)
{
cout<<"pairwise coprime"<<endl;
}
else
cout<<"setwise coprime"<<endl;
return 0;
}