2020牛客NOIP赛前集训营-普及组(第四场)前3题

牛客竞赛第四场

4.项链

1.时间

题目描述:

众所周知,NOIP及其模拟赛的比赛时长均为3小时30分钟。

Alice和Bob参加了于h时m分开始的2020牛客NOIP赛前集训营-提高组,请你告诉他们比赛结束的时间。

输入格式:

共一行:一个形如hh:mm的字符串,表示比赛开始的时间。位数不足将填补0。

输出格式

共一行:一个形如hh:mm的字符串,表示比赛结束的时间。位数不足请填补0。

样例输入:
00:00
样例输出:
03:30
题解:

先把输入的时间换成分再 + + + 210 (也就是3小时30分),然后模 1440 1440 1440 保证小时数不超过 24 24 24
÷   60 \div \ 60 ÷ 60 就是分,模 60 60 60 就是分。

上代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
	int a,b;
	scanf("%d:%d",&a,&b);
	int x=a*60+b+210;
	if(x>=1440)
	x=x%1440;
	int p=x/60;
	int y=x%60;
	//注意不足两位前面要添0补齐
	if(p<10&&y>=10)
	printf("0%d:%d",p,y);
	else if(p<10&&y<10)
	printf("0%d:0%d",p,y);
	else if(p>=10&&y<10)
	printf("%d:0%d",p,y);
	else
	printf("%d:%d",p,y);
}

2.石子

题目描述:

Alice 和 Bob 从小就一起玩石子。
有一天,他们又想愉快的玩一个石子游戏。
一共有 n 堆石子,第 i 堆石子有 ai个,两人轮流操作。
Alice 走先手,每个人每个回合只能对一堆石子进行操作,Alice 每次操作只能拿偶数个石子,Bob 每次操作只能拿奇数个石子, 每次操作至少拿走一个石子,直到一方无法进行任何操作,无法操作的人失败。
假设Alice与Bob都是绝顶聪明的,如果 Alice 可以获胜,那么输出 YES,否则输出 NO。

输入格式

多组数据。对于每组数据,第一行输入一个正整数 n,第二行输入 n 个正整数,第 i 个数表示 ai。

输出格式

对于每组数据,每行输出一个字符串YES或NO。

样例输入1:
2
2 1
样例输出1:
NO
样例输入2:
1
6
样例输出2:
YES
题解:

只要Bob,每次拿偶数堆都取走奇数个让所有的堆数都变成奇数堆。

因为Alice每次只能拿偶数个所以每堆最后肯定会剩一个石子。

就可以了

还有一个特殊的情况:只要一堆且那一堆是偶数堆这样Alice可以直接把他拿完Bob就不能操作了

还要记住是多组数据。

上代码:

#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int main()
{
    
    
	int n;
	while(scanf("%d",&n)!=EOF)
	{
    
    
		for(int i=1;i<=n;i++)
		{
    
    
			scanf("%d",&a[i]);
		}
		if(n==1&&a[1]%2==0)  //判断那个特殊的情况
		{
    
    
			printf("YES\n");
		}
		else
		{
    
    
			printf("NO\n");
		}
	}
}
3.卡片
题目描述:

Alice和Bob各带来一个正多边形卡片。
Alice的卡片是边长为a的正m边形,Bob的卡片是边长为b的正n边形。
Alice和Bob将两张卡片摆放在一起,其中两张卡片并不重叠,并且有至少一个公共顶点和一条公共边。
Alice喜欢旋转,因此她沿Bob的卡片顺时针旋转自己的多边形。
旋转的中心点是多边形公共边上一点,且旋转过程中两张卡片不重叠。
Alice想知道,在旋转多少次过后,Alice的正多边形会回到原位置。

输入格式:

一行,四个整数a,m,b,n,含义如题目描述所述。

输出格式:

一行,一个数Ans,表示Alice旋转的次数。

输入样例1:
2 4 3 4
输出样例1:
8

第一个样例的前两次操作图片解释

输入样例2:
3 4 4 4
输出样例2:
24
输入样例3:
2020 1024 2021 1025
输出样例3:
828200
题解:

先写好 gcd ⁡ \gcd gcd lcm ⁡ \operatorname{lcm} lcm 。(注意用long long)

第一步先求 Alice 的卡片要在 Bob 球上滚的长度 , x = l c m ( a   ,   b × n ) x=lcm(a\ ,\ b\times n) x=lcm(a , b×n)

因为要转到原来的位置所以要求 l c m lcm lcm

第二步求转回原来的位置要经过多少个顶点, y = l c m ( a   ,   b × n ) ÷ b y=lcm(a\ ,\ b\times n)\div b y=lcm(a , b×n)÷b

第三步求在转的时候有多少次两个多边形的点重合在一起 t = l c m ( a , b ) / b t=lcm(a,b)/b t=lcm(a,b)/b

最后结果就是 x / a + y − y / t x/a+y-y/t x/a+yy/t

#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL gcd(LL a,LL b)
{
    
    
	if(b==0)return a;
	return gcd(b,a%b);
}
LL lcm(LL a,LL b)
{
    
    
	return a*b/gcd(a,b);
}
int main()
{
    
    
	LL a,m,b,n;
	scanf("%lld%lld%lld%lld",&a,&m,&b,&n);
	LL t=lcm(a,b)/b;
	LL x=lcm(a,b*n);
	LL y=x/b;
	printf("%lld\n",x/a+y-y/t);
}

4.项链

没有了哈

谢谢观看

猜你喜欢

转载自blog.csdn.net/weixin_50773864/article/details/109313993