由于这个周末有事没能参加这次的训练,回学校之后补了几个比较简单的题。
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;
}