Acwing第77场周赛

T1

两支足球队之间展开了一场足球赛。

整场比赛双方一共打进了 n

个进球,进球多的一方将收获最终的胜利。

请你根据进球纪录,判断哪支球队最终获胜。

保证不存在平局。
输入格式

第一行包含整数 n。

接下来 n
行,其中第 i 行记录了打进第 i

个进球的球队的名称。

球队名称由大写字母构成,长度范围 [1,10]。

保证输入中包含的不同球队不超过两支。
输出格式

输出最终获胜队伍的名称。
数据范围

前 5个测试点满足 1≤n≤5。
所有测试点满足 1≤n≤100。
输入样例1:

1
ABC

输出样例1:

ABC

输入样例2:

5
A
ABA
ABA
A
A

输出样例2:

A

简单的题,暴力一点可以直接用map,但是其中只有2个队,所以可以不用遍历:

map.begin()->second的值就是第一个队的分数
–map.end()->second的值就是第二个队的分数
–map.end()也就是map.rbegin()
所以–map.end()->second就可以写成map.rbegin()->second
如果map.begin()->second>map.rbegin()->second
那么第一个队获胜,输出第一个队的名字:map.begin()->first
否则第二个队获胜,输出第二个队的名字:map.rbegin()->second

Code:

#include <bits/stdc++.h>
using namespace std;
map<string, int> mp;
int main () {
	int n; string s;
	cin >> n;
	while (n -- ) { cin >> s; mp[s] ++; } //将得分的队伍分数++
	int v1 = mp.begin () -> second;
	int v2 = mp.rbegin () -> second;
	string s1 = mp.begin () -> first;
	string s2 = mp.rbegin () -> first;
	/*         存储分数即队伍名称             */
	if (v1 > v2) cout << s1; else cout << s2; //输出 
	return 0;
}

Code(问号表达式压行):

#include <bits/stdc++.h>
using namespace std;
map<string, int> mp;
int main () {
    int T; string str;
    cin >> T;
    while (T -- ) { cin >> str; mp[str] ++; } //将得分的队伍分数++ 
    cout << (mp.rbegin () -> second > mp.begin () -> second? mp.rbegin () -> first: mp.begin () -> first); //问号表达式 
    return 0;
}

T2

n 个小朋友围成一圈,按顺时针顺序依次编号为 1∼n

。

有 7

种颜色的帽子,每种颜色的帽子的数量都足够多。

7种颜色不妨表示为 R、O、Y、G、B、I、V。

现在,要给每个小朋友都发一个帽子,要求:

    每种颜色的帽子都至少有一个小朋友戴。
    任意四个相邻小朋友的帽子颜色都各不相同。

请你提供一种分发帽子的方案。
输入格式

共一行,包含一个整数 n。
输出格式

输出一行长度为 n
的由代表颜色的字符组成的字符串,其中的第 i 个字符表示第 i

个小朋友分到的帽子的颜色。

如果方案不唯一,输出任意合理方案均可。
数据范围

所有测试点满足 7≤n≤100。
输入样例1:

8

输出样例1:

ROYGRBIV

输入样例2:

13

输出样例2:

ROYGBIVGBIVYG

由题给出的序列七种颜色为R,O,Y,G,B,I,V。由题n>=7,显然前七个序列为R,O,Y,G,B,I,V,则条件1已经满足。然后我们思考如何相邻四个人不重复,若是后面的元素都是G,B,I,V为循环节,多次循环,则可以满足我们构造的条件。至此构造已经完成。

Code

#include <bits/stdc++.h>
using namespace std;
int main () {
	int n; cin >> n; string str = "ROYGBIV", p = "GBIV";
	for (int i = 0; i < n / 4; i ++ ) cout << str;
	for (int i = 0; i < n % 4; i ++ ) cout << p[i];
	return 0;
}

T3

给定一个 n×m

的方格矩阵。

将一个弹球放置到其中的任意一个方格之中,并使其沿四个对角方向之一(左上、左下、右上、右下)进行无限移动。

当弹球移动至矩阵边缘的方格时,它可以发生反弹并继续移动。

更具体地说,当它到达矩阵边(但并非角)上的方格时,它可以将移动方向改变 90
度并继续移动,当它到达矩阵角上的方格时,它可以将移动方向改变 180

度并继续移动。

1.png

不难发现,弹球会沿着一个固定的线路进行无限循环移动。

我们认为两个线路不同,当且仅当两个线路包含的方格不完全相同(而不考虑弹球的具体移动方向)。

弹球在不同的初始位置沿不同的初始方向进行移动,其移动线路可能不同,也可能相同。

现在,请你计算弹球一共可能有多少种不同的移动线路。
输入格式

共一行,包含两个整数 n,m

。
输出格式

一个整数,表示弹球可能的移动线路数量。
数据范围

前 6
个测试点满足 2≤n,m≤4。
所有测试点满足 2≤n,m≤106

。
输入样例1:

3 4

输出样例1:

2

输入样例2:

3 3

输出样例2:

3

这道题在codeforces上是有一样的题的(虽然说题目描述不一样,但是模型是完全一样的),推到可以推导出:

answer=gcd(n-1,m-1)+1;

题解

Code:

#include <iostream>
using namespace std;
int gcd (int a, int b) { return b == 0? a: gcd (b, a % b); }
int main () {
    int a, b; cin >> a >> b;
    cout << gcd (a - 1, b - 1) + 1;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

{∞}

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值