19年11月10号个人训练赛补题

  • Post author:
  • Post category:其他


由于这个周末有事没能参加这次的训练,回学校之后补了几个比较简单的题。




F


题意


给你一个字符串,依次从中取四个字符(取完之后放回),问取到的四个字符是a,v,i,n,(四个字符无序)的概率是多少,输出一个最简的分数。


思路


分别求出字符串中a,v,i,n字符出现的次数,并将四个数相乘,与字符串长度求gcd,两个数分别除于gcd,输出即可。

#include<bits/stdc++.h>
using namespace std;
char s;
int n;
int main()
{
	cin>>n;
	int aa=0,vv=0,ii=0,nn=0;
	for(int i=1;i<=n;i++)
	{
		cin>>s;
		if(s=='a') aa++;
		if(s=='v') vv++;
		if(s=='i') ii++;
		if(s=='n') nn++;
	}
	if(aa&&vv&&ii&&nn)
	{
		int a=aa*vv*ii*nn;
		int b=n*n*n*n;`在这里插入代码片`
		int m=__gcd(a,b);
		a=a/m;
		b=b/m;
		printf("%d/%d\n",a,b);
	}
	else
	{
		printf("0/1\n");	
	} 
	return 0;
}




G


题意


一个十字路口,有东西和南北方向的车辆,如果同时有车,南北方向的车要等东西方向的车,问南北方向的所有车至少要等多长时间,才能使两个放心不同时有车。


思路


对东西车辆的时间进行标记,枚举时间。


注意


由于采用标记法,a数组的范围至少2000.

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int a[11000],b[11000];
int main()
{
	while(cin>>n>>m)
	{
		memset(a,0,sizeof a);
		memset(b,0,sizeof b);
		for(int i=1;i<=n;i++)
		{
			cin>>k;
			a[k]=1;
		}
		for(int i=1;i<=m;i++)
		{
			cin>>b[i];
		}
		for(int i=0;;i++)
		{
			int flag=1;
			for(int j=1;j<=m;j++)
			{
				if(a[b[j]+i]==1)
				{
					flag=0;
					break;
				}
			}
			if(flag)
			{
				printf("%d\n",i);
				break;
			}
		}
	}
	return 0;
}




I


题意


给你n个数据范围为1e18的小数,对小数点后面的第三位进行四舍五入,输出四舍五入后与之前的差值。


思路


因为数据范围比较大,用字符串进行存储,对最后一位进行操作即可。

#include<bits/stdc++.h>
using namespace std;
int n;
double a,sum=0;
double d=0.5;
char s[30];
int main()
{
	cin>>n;
	while(n--)
	{
		cin>>s;
		int nn=strlen(s)-1;
		double m=(s[nn]-'0');
		if(m<5)
		{
			sum=sum-m;
		}
		if(m>=5)
		{
			sum=sum+(10-m);
		}
	}
	printf("%.3f\n",sum/1000.0);
	return 0;
}




J


题意


n个工地,m个工人,每个人在第i个工地上每天得到的工钱为ai,问如何分配工人能使所有的工地一天的支出相等。


思路


求所有ai的lcm,lcm为每个工地一天的最少支出。根据lcm求出工人数与m对比,并对lcm进行相应的放大。


注意


数据范围比较大,用long long。

#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long a[3100];
long long lcm(long long a,long long b)
{
	return a*b/__gcd(a,b);
}
int main()
{
	while(cin>>n>>m)
	{
		long long all=1;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			all=lcm(all,a[i]);
		}
		long long sum=0;
		for(int i=1;i<=n;i++)
		{
			sum=sum+all/a[i];
		}
		if(!(m%sum))
		{
			long long k=m/sum;
			printf("Yes\n");
			for(int i=1;i<n;i++)
			{
				printf("%lld ",all/a[i]*k);
			}
			printf("%lld\n",all/a[n]*k);
		}
		else
		{
			printf("No\n");
		}
	}
	return 0;
}



K


题意


x=a+b y=a-b

求 a

b


思路


(a+b)

(a-b)/4 即为答案

#include<bits/stdc++.h>
using namespace std;
int a,b;
int main()
{
	cin>>a>>b;
	int c=(a+b)/2;
	int d=(a-b)/2;
	printf("%d\n",c*d);
	return 0;
}



版权声明:本文为qq_19830591原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。