1.
给定两个正整数n,m,米小游想要求出n-m中的所有整数的哪个数字中4的数量加上 6 的数量最多。
如果有多个这样的数字,请输出最大的。例如某一个数字是 44624,则它有3个4,1个6,所以4和6的数量之和为 4。
打卡题
int main(int argc, char *argv[]) {
int n,m;
cin>>n>>m;
int res = 0;
int ans = n;
for(int i=n;i<=m;i++){
int cur = i;
int cnt = 0;
while(cur){
int num = cur%10;
if(num==4||num==6) cnt++;
cur/=10;
}
if(cnt>=res){
res = cnt;
ans = i;
}
}
cout<<ans<<endl;
return 0;
}
2. 英桀挑战
米小游正在挑战往事乐土,往事乐土中有n个关卡,m位英桀,挑战完每个关卡后可以在三位不同英桀给出的奖励中选择一个,每个奖励的能力值为,来源为第位英桀。
若米小游至少获得了三个来源为同一位英桀的奖励,她可以获得来自这位英桀的额外奖励,能力值为。米小游想知道,她挑战完这n个关卡最多可以获得多少能力值?
回溯递归
int main(int argc, char *argv[]) {
int n,m;//关卡数量n,英雄数量m
cin>>n>>m;
vector<int> c(m+1);//英雄额外奖励
for(int i=1;i<=m;i++)
cin>>c[i];
vector<vector<int>> a(n,vector<int>(3));
vector<vector<int>> b(n,vector<int>(3));
for(int i=0;i<n;i++){
cin>>a[i][0]>>a[i][1]>>a[i][2];
cin>>b[i][0]>>b[i][1]>>b[i][2];
}
int res = 0;
vector<int> cnt(m+1);//对m个英雄计数
//也就是说每一个关卡,有三个选择,这里可以直接回溯选择
function<void(int,int)> f = [&](int idx,int sum)->void{
if(idx==n){//遍历完门进行结算
for(int i=1;i<=m;i++){
if(cnt[i]>=3) sum+=c[i];
}
res = max(res,sum);
return;
}
for(int i=0;i<3;i++){//对三个英雄进行选择
cnt[b[idx][i]]++;
f(idx+1,sum+a[idx][i]);
cnt[b[idx][i]]--;
}
};
f(0,0);
cout<<res<<endl;
return 0;
}
3. 点燃心海
米小游和流莹到达了一个被红色海洋包裹着的星球,星球上有一些陆地,流萤准备点燃其中一片大海。具体来说,就是在一张二维地图上,分成了n*m 个格子,
每个格子的类型要么是大海,要么是陆地。若相邻(通过格子的边相邻)两个格子的类型相同,则视为同一个连通块。
大海被点燃后会变成陆地,点燃一片大海就是把一个大海连通块变成一个陆地连通块。米小游想知道在流萤最多点燃一片大海后,最大陆地连通块大小的最大值是多少。
递归搜索同时采用并查集思维标区域号,先搜索海洋,再搜索陆地
搜索时候记录对应连通序号的数目,同时搜索陆地时,将序号放入其连通的海洋里,方便直接计算总和
int main(int argc, char *argv[]) {
int m,n;
cin>>m>>n;
vector<vector<char>> grid(m,vector<char>(n));
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>grid[i][j];
vector<vector<int>> flag(m,vector<int>(n,-1));
unordered_map<int,int> mp;//记录对应连续域格子数目
unordered_map<int,unordered_set<int>> connect;//记录与对应海域连通的陆地
//先找海域
int idx = 0;
int dir[4][2] = {{1,0},{0,-1},{-1,0},{0,1}};
function<void(int,int,int)> dfs = [&](int x,int y,int id){
mp[id]++;//所属区域格子数目增加
flag[x][y] = id;
for(int i=0;i<4;i++){
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if(nx<0||ny<0||nx==m||ny==n) continue;
if(grid[x][y]=='#'&&grid[nx][ny]=='.') connect[flag[nx][ny]].insert(id);
if(grid[nx][ny]!=grid[x][y]||flag[nx][ny]!=-1) continue;//不相同或者遍历过
dfs(nx,ny,id);
}
};
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(grid[i][j]=='.'&&flag[i][j]==-1)
dfs(i,j,idx++);
}
int oceannum = idx;//海洋数目
//再找陆地
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(grid[i][j]=='#'&&flag[i][j]==-1)
dfs(i,j,idx++);
}
int res = 0;
for(int i=0;i<oceannum;i++){//遍历海洋连通块
int cur = mp[i];
for(int cnt:connect[i])
cur+=mp[cnt];
res = max(res,cur);
}
cout<<res<<endl;
return 0;
}
标签:连通,vector,07,int,res,2024.09,英桀,米哈,米小游
From: https://www.cnblogs.com/929code/p/18405527