import java.util.Scanner;
publicclassMain {
publicstaticvoidmain(String[] args) {
int[] res = newint[26];
Scannerscanner=newScanner(System.in);
Stringstr= scanner.next();
for (char c : str.toCharArray()) {
res[c - 'A']++;
}
intmaxNum=0;
for (int i : res) { maxNum = Math.max(maxNum, i); }
for (inti=0; i < 26; i++) {
if (res[i] == maxNum) {
System.out.print((char) (i + 'A'));
}
}
scanner.close();
}
}
C++ 版:
#include<iostream>usingnamespace std;
intmain(){
int res[26]={0};
string str;
cin>>str;
for(char c : str){ res[c-'A']++; }
int max_num=0;
for(int i:res) max_num = max(max_num,i);
for(int i=0; i<26; ++i){
if(res[i]==max_num) cout<<char(i+'A');
}
return0;
}
二、连连看
寻找一对格子使得这两个格子中的整数相等,且它们的位置满足 |a-c|=|b-d|>0。
C++ 版:
#include<iostream>usingnamespace std;
int arr[1005][1005],cur1[2005][1005],cur2[2005][1005];
intmain(){
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
cin >> arr[i][j];
int ans = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
ans += cur1[i - j + 1000][arr[i][j]] + cur2[i + j][arr[i][j]];
cur1[i - j + 1000][arr[i][j]]++;
cur2[i + j][arr[i][j]]++;
}
}
cout<<ans*2<<endl;
}
三、团建
计算两个人从各自树的根结点出发走向某个叶结点,路径上经过的所有结点上的权值构成的序列的最长公共前缀。
C++ 版:
#include<iostream>#include<unordered_map>#include<vector>#define ll long longconstint num = 2e5+5;
ll n_arr[num];
ll m_arr[num];
usingnamespace std;
unordered_map<int,vector<int>> n_umap;
unordered_map<int,vector<int>> m_umap;
voiddfs(int a, int b, int cur){
if(n_arr[a]!=m_arr[b]) return;
cur += 1;
count = max(count,cur);
for(int i=0; i<n_umap[a].size(); ++i){
for(int j=0; j<m_umap[b].size(); ++j){
dfs(n_umap[a][i],m_umap[b][j],cur);
}
}
}
intmain(){
int n,m;
cin>>n>>m;
for(int i=1; i<=n; ++i) cin>>n_arr[i];
for(int j=1; j<=m; ++j) cin>>m_arr[j];
int l,r;
for(int i=0; i<n-1; ++i){ cin>>l>>r; n_umap[l].push_back(r); }
for(int i=0; i<m-1; ++i){ cin>>l>>r; m_umap[l].push_back(r); }
dfs(1,1,0);
cout<<count<<endl;
return0;
}
四、k 倍区间
计算有多少个区间 [i,j] 满足 Si,j 是 k 的非负整数倍。
C++ 版:
#include<iostream>#include<unordered_map>#include<vector>#include<algorithm>#define ll long longusingnamespace std;
intmain(){
int n,k;
cin>>n>>k;
unordered_map<int,vector<ll>> umap;
umap[0].push_back(-1);
ll sum[n];
int count = 0;
int cur;
for(int i=0; i<n; ++i){
cin>>cur;
if(i==0) sum[i] = cur;
else sum[i] = sum[i-1] + cur;
ll num = sum[i]%k;
if(num<0) num+=k;
vector<ll>& vec = umap[num];
auto it = upper_bound(vec.begin(),vec.end(),sum[i]);
count += it-vec.begin();
vec.insert(it,sum[i]);
}
cout<<count;
return0;
}
知识点
1、multimap 如何查询值
本质上,这是一个非常简单的问题!
#include<iostream>#include<map>usingnamespace std;
intmain(){
multimap<int,int> mmap;
mmap.insert({1,2});
mmap.insert({1,3});
mmap.insert({2,4});
auto it = mmap.find(1);
while(it!=mmap.end()&&it->first==1){
cout<<it->first<<it->second<<endl;
it++;
}
return0;
}
2、vector 初始化-pair
vector<pair<int,int>> res{ pair<int,int>(1,1) };
3、库 upper_bound(二分查找的应用)
查找一个有序数列,并返回第一个大于某个数的位置!
可拓展性-cmp
#include"iostream"#include"vector"#include"algorithm"usingnamespace std;
boolcmp(int a,int b){ return a>b; }
intmain(){
vector<int> res{1,23,4,6,1,234};
sort(res.begin(),res.end());
auto it = upper_bound(res.begin(),res.end(),7);
auto i = it-res.begin();
cout<<i<<endl;
return0;
}