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;
}