牛客竞赛第四场
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+y−y/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.项链
没有了哈