4716. 进球 - AcWing题库 考察map
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
int main(){
int n; cin >> n;
map<string, int> mp;
for (int i = 0; i < n; i ++ ){
string s; cin >> s;
mp[s] ++;
}
int mx = 0;
string ans;
for (auto [k, v] : mp){
if(mx < v){
ans = k;
mx = v;
}
}
cout << ans << endl;
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
int n; cin >> n;
n -= 3;
string a = "ROYG", ans;
for (int i = 0; i < n / 4; i ++ ){
ans += a;
}
ans += a.substr(0, n % 4);
ans += "BIV";
cout << ans << endl;
return 0;
}
- 证明每条路径到四周的点是各不相同的,类似于光路
- 把同一条光路的四周的点划分为一个集合,即并查集
- 同时给四周的点重新分配点的编号
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 4e6 + 10;
int p[N];
int n, m;
//给四边的点重新分配数字编号
int get(int x, int y){
if(x == 1) return y;
if(y == m) return m + x - 1;
if(x == n) return m + n + m - y - 1;
if(y == 1) return m + n + m + n - x - 2;
return 0;
}
int find(int x){
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
//组合
int comb(int a, int b){
int pa = find(a), pb = find(b);
p[pa] = pb;
}
int main(){
cin >> n >> m;
if(n > m) swap(n, m);
for (int i = 1; i <= (n + m) * 2 - 4; i ++ ) p[i] = i;
for (int i = 1; i <= m; i ++ ){
//向左边发射
if(i <= n){
comb(get(1, i), get(i, 1)); //上层往左下方
comb(get(n, i), get(n - i + 1, 1)); //下层往左上方
}else{
comb(get(1, i), get(n, i - n + 1)); //上层往左下方
comb(get(n, i), get(1, i - n + 1)); //下层往左上方
}
//向右边发射
if(i < m - n + 1){
comb(get(1, i), get(n, i + n - 1)); //上层往右下方
comb(get(n, i), get(1, i + n - 1)); //下层往右上方
}else{
comb(get(1, i), get(m + 1 - i, m)); //上层往右下方
comb(get(n, i), get(i - m + n, m)); //下层往右上方
}
}
int cnt = 0;
for(int i = 1; i <= (n + m) * 2 - 4; i ++ ){
if(p[i] == i) cnt ++;
}
cout << cnt << endl;
return 0;
}