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

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

F

题意
给你一个字符串,依次从中取四个字符(取完之后放回),问取到的四个字符是a,v,i,n,(四个字符无序)的概率是多少,输出一个最简的分数。
思路
分别求出字符串中a,v,i,n字符出现的次数,并将四个数相乘,与字符串长度求gcd,两个数分别除于gcd,输出即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#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的小数,对小数点后面的第三位进行四舍五入,输出四舍五入后与之前的差值。
思路
因为数据范围比较大,用字符串进行存储,对最后一位进行操作即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#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
求 ab
思路
(a+b)
(a-b)/4 即为答案

1
2
3
4
5
6
7
8
9
10
11
#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;
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • © 2020 Super Monkey
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信