训练赛一

训练链接

D.

分析:按照题意是求两交替且各自相同的子序列,用vector存每个数出现的不同位置,两个for循环遍历,每次取出i,j,now用于定位当前交替进行位置,x1,x2分别定位i,j,位置。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<vector>
using namespace std;
vector<int>v[105];
int main()
{
	int n,m;
	int x;
	int res=0;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		v[x].push_back(i);
	}
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(i==j)
				continue;
			int x1=0,x2=0,sum=0,now=0;
			while(1)
			{
				while(x1<v[i].size()&&v[i][x1]<now)//去除多余 
					x1++;
				now=v[i][x1];
				if(x1==v[i].size())
					break;
				sum++;
				while(x2<v[j].size()&&v[j][x2]<now)
					x2++;
				now=v[j][x2];
				if(x2==v[j].size())
					break;
				sum++;
			}
			res=max(res,sum);
		}
	}
	printf("%d\n",res);
	return 0;
}
/*
6 2
1 2 1 2 1 2
*/

F.

分析,难度较低,求一下最大公约数就行

#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<string.h>
using namespace std;
int gcd(int a,int b)
{
	if(a%b==0)
		return b;
	else
		return gcd(b,a%b);
}
int main()
{
	int n,l;
	int ant;
	scanf("%d",&n);
	char a[1010];
	int x=0,y=0,z=0,w=0;
//	scanf()
	scanf("%s",a);
	l=strlen(a);
	for(int i=0;i<l;i++)
	{
		if(a[i]=='a')
			x++;
		else if(a[i]=='v')
			y++;
		else if(a[i]=='i')
			z++;
		else if(a[i]=='n')
			w++;
	}
	if(x*y*z*w==0)
		printf("0/1\n");
	else
	{
		ant=gcd(l*l*l*l,x*y*z*w);
		printf("%d/%d\n",x*y*z*w/ant,l*l*l*l/ant);
	}
	return 0;
}

G.

分析:真的是难度不够,题意来凑。用map存ai数组存bi,k为每次bi等待的时间,k从0遍历到ai的最大值+1即可

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
const int maxn=1e3+10;
map<int,int>p;
int main()
{
	int x;
	int ant=0;
	int k=0;
	bool flag;
	int a[maxn];
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&x);
		if(x>ant)
			ant=x;
		p[x]++;
	}
	for(int i=0;i<m;i++)
		scanf("%d",&a[i]);
	for(k=0;k<=ant+1;k++)
	{
		flag=0;
		for(int i=0;i<m;i++)
		{
			if(p[a[i]+k])
			{
				flag=1;
				break;
			}
		}
		if(!flag)
		{
			printf("%d\n",k);
			break;
		}
	}
	return 0;
 } 

H.可推出 (n+1)/(n*2)取余mod

      费马小定理求逆元(快速幂),即可

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll ksm(ll a,ll b)
{
	ll res=1;
	while(b)
	{
		if(b&1)
			res=(res*a+mod)%mod;
		a=(a*a+mod)%mod;
		b>>=1;
	}
	return res;
}
int main()
{
	ll n;
	while(~scanf("%lld",&n))
	{
		printf("%lld\n",(n+(ll)1)*(ksm(2*n,mod-2)+mod)%mod);
	}
	return 0;
}

I.难度不大,字符串读入,找出  .  的位置,判断 .  后第三位即可

#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<string.h>
using namespace std;
int main()
{
	int n,l;
	char a[50];
	double x=0;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%s",a);
		l=strlen(a);
		for(int i=0;i<l;i++)
		{
			if(a[i]=='.')
			{
				if(a[i+3]>='5')
				{
					x+=(10-(a[i+3]-'0'))*0.001;
				}
				else
				{
					x-=(a[i+3]-'0')*0.001;
				}
				break;
			}
		}
	}
	printf("%0.3lf\n",x);
	return 0;
}

J.求每个工厂效率的最小公倍数,用最小公倍数除以每个工厂效率后累加和ant,判断总人数是否为ant倍数即可

​#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int gcd(int a,int b)
{
	int t;
	if(a<b)
	{
		t=a;
		a=b;
		b=t;
	}
	if(a%b==0)
		return b;
	else
		return gcd(b,a%b);
}
int gce(int a,int b)
{
	return (a*b)/gcd(a,b);
}
int main()
{
	int n;
	ll m;
	ll ans=0;
	int a[1010];
	int b=1;
	ll ant=0;
	scanf("%d%lld",&n,&m);
//	printf("%d %lld",n,m);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		ans+=a[i];
//		printf("%d\n",a[i]);
		b=gce(b,a[i]);
//		printf("b : %d\n",b);
	}
	for(int i=0;i<n;i++)
	{
		ant+=b/a[i];
	}
	if(m%ant!=0)
		printf("No\n");
	else
	{
		printf("Yes\n");
		for(int i=0;i<n;i++)
		{
			if(!i)
				printf("%lld",(m/ant)*(b/a[i]));
			else
				printf(" %lld",(m/ant)*(b/a[i]));
		}
		printf("\n");
	}
	return 0;
}​

K.签到题

#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d\n",((a+b)/2)*(a-(a+b)/2));
	return 0;
}
发布了40 篇原创文章 · 获赞 2 · 访问量 866

猜你喜欢

转载自blog.csdn.net/qq_43851311/article/details/103036760