题目链接:点击打开链接
A题:水题,找出频率出现次数最多的且数值最小的数
#include<bits/stdc++.h>
#define cle(n) memset(n,0,sizeof(n))
typedef long long ll;
const int maxn =1e6+10;
using namespace std;
int T,n,m;
string s;
int a[maxn];
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d",&n); cle(a);
for(int i=0;i<n;i++){
int t;
cin>>s>>t;
a[t]++;
}
int temp_num=0;
int temp=0;
for(int i=11111;i<=99999;i++){
if(temp<a[i])temp_num=i,temp=a[i];
}
cout<<temp_num<<endl;
}
return 0;
}
B题,找a串和b串的最长前缀的长度,b串中任意两个字母可以互换。
#include<bits/stdc++.h>
#define cle(n) memset(n,0,sizeof(n))
typedef long long ll;
const int maxn =1e6+10;
using namespace std;
int T;
string a,b;
int main()
{
scanf("%d",&T);
while(T--){
cin>>a>>b;
int c[26]={0},d[26]={0};
int len_b=b.length();
for(int i=0;i<len_b;i++)
d[b[i]-'a']++;
int ans=0;
int len_a=a.length();
for(int i=0;i<len_a;i++)
{
if(d[a[i]-'a']<=0)break;
else d[a[i]-'a']--,ans++;
}
cout<<ans<<endl;
}
}
C题:选出最短的路(且id最小),简单排序
#include<bits/stdc++.h>
#define cle(n) memset(n,0,sizeof(n))
typedef long long ll;
const int maxn =1e6+10;
using namespace std;
int T,n,m;
struct Node{
int x,id;
};
int cmp(const Node &a, const Node &b)
{
if(a.x==b.x)return a.id<b.id;
return a.x<b.x;
}
int main()
{
cin>>T;
while(T--){
Node a[3];
for(int i=0;i<3;i++)
a[i].id=i+1;
for(int i=0;i<3;i++)
cin>>a[i].x;
sort(a,a+3,cmp);
int flag=a[0].id;
if(flag==1)cout<<"First"<<endl;
else if(flag==2)cout<<"Second"<<endl;
else cout<<"Third"<<endl;
}
return 0;
}
D题:读完题目后你会发现它是一个组合数, 答案是 2*C(a-1,b)%MOD
#include<bits/stdc++.h>
#define cle(n) memset(n,0,sizeof(n))
typedef long long ll;
const int maxn =1e6+10;
using namespace std;
const int N = 1e5+10;
const int MOD = (int)1e9 + 7;
int F[N], Finv[N], inv[N];//F是阶乘,Finv是逆元的阶乘
void init(){
inv[1] = 1;
for(int i = 2; i < N; i ++){
inv[i] = (MOD - MOD / i) * 1ll * inv[MOD % i] % MOD;
}
F[0] = Finv[0] = 1;
for(int i = 1; i < N; i ++){
F[i] = F[i-1] * 1ll * i % MOD;
Finv[i] = Finv[i-1] * 1ll * inv[i] % MOD;
}
}
int comb(int n, int m){//comb(n, m)就是C(n, m)
if(m < 0 || m > n) return 0;
return F[n] * 1ll * Finv[n - m] % MOD * Finv[m] % MOD;
}
int T;
int a,b;
int main()
{
init();
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&a,&b);
printf("%d\n",2*comb(a-1,b)%MOD);
}
}
E题,简单规律题,答案为n+k-1
#include<bits/stdc++.h>
#define cle(n) memset(n,0,sizeof(n))
typedef long long ll;
const int maxn =1e6+10;
using namespace std;
int T;
int n,k;
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&k);
cout<<n+k-1<<endl;
}
}
G题:前缀和+LCM 时间复杂度为O(n^2)
#include<bits/stdc++.h>
#define cle(n) memset(n,0,sizeof(n))
typedef long long ll;
const int maxn =1e6+10;
using namespace std;
const ll mod=1e9+7;
ll a[maxn],sum[maxn];
ll maxt=2000*1e9;
int T,n;
ll lcm(ll a,ll b){
return a/__gcd(a,b)*b;
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%I64d",&a[i]);
sum[0]=0;
for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
ll ans=0,temp=0;
for(int i=1;i<=n;i++){
temp=a[i];
for(int j=i;j<=n;j++){
temp=lcm(temp,a[j]);
if(temp>maxt)break;
if((sum[j]-sum[i-1])%temp==0)ans++;
}
}
printf("%I64d\n",ans);
}
}
H题:模拟题
#include<bits/stdc++.h>
#define cle(n) memset(n,0,sizeof(n))
typedef long long ll;
const int maxn =1e6+10;
using namespace std;
const ll mod=1e9+7;
int T;
int n,s;
int ans[maxn];
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&s);
///不符合条件
if(n%2==0&&s%2){
printf("-1\n"); continue;
}
if((n>=2&&s<2)||n*9<s){
printf("-1\n"); continue;
}
cle(ans);
for(int i=1;i<=n;i++)ans[i]=9;
int temp=n*9;
temp-=s;
if(n%2)///表示是奇数
{
if(temp<=9) ans[(n+1)/2]=9-temp,temp=0;
else
{
if(temp%2) ans[(n+1)/2]=0,temp-=9;
else ans[(n+1)/2]=1,temp-=8;
for(int i=(n+1)/2-1,j=(n+1)/2+1;i>=1,j<=n;i--,j++)
{
if(temp>=18) ans[i]-=9,ans[j]-=9,temp-=18;
else ans[i]-=temp/2,ans[j]-=temp/2,temp=0;
if(temp==0)break;
}
}
}
else///表示是偶数
{
for(int i=n/2,j=n/2+1;i>=1,j<=n;i--,j++)
{
if(temp>=18) ans[i]-=9,ans[j]-=9,temp-=18;
else ans[i]-=temp/2,ans[j]-=temp/2,temp=0;
if(temp==0)break;
}
}
for(int i=1;i<=n;i++)printf("%d",ans[i]);
printf("\n");
}
}
//I 简单博弈
#include<bits/stdc++.h>
#define cle(n) memset(n,0,sizeof(n))
typedef long long ll;
const int maxn =1e6+10;
using namespace std;
int T;
int n,m;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int flag=0;
int t1=max(n,m);
int t2=min(n,m);
if(t1%2==0&&t2%2==0)flag=1;
else flag=0;
if(flag==0)
cout<<"hasan"<<endl;
else cout<<"abdullah"<<endl;
}
}
J题
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
#define LL long long
#define MOD 1000000007
#define CLR(a,x) memset(a,x,sizeof(a))
#define INF 0x3f3f3f3f
#define pb push_back
#define FOR(i,a,b) for( int i = ( a ); i <= ( b ); ++i )
#define WHILE() int T;scanf( "%d", &T );while( T-- )
const int N = 1e5+7;
char str[N];
int len;
bool ans;
void solve() {
FOR( i, 2, len/2 )
{
int j = i;
bool flag = true;
while( j <= len )
{
if( str[j] != ' ' ) {
flag = false;
break;
}
j += i;
}
if( j-i != len ) {
flag = false;
}
if( flag ) {
ans = true;
return;
}
}
}
int main()
{
int w;
scanf( "%d", &w );
getchar();
while( w-- ) {
ans = false;
str[0] = '0';
gets( str+1 );
len = strlen( str );
str[len] = ' ';
solve();
if( ans ) {
printf( "YES\n");
} else {
printf( "NO\n");
}
}
return 0;
}