20240410暑期实习
第1题-云服务计费-嵌套字典
#include<bits/stdc++.h>
#include<map>
using namespace std;
void solve(){
int n;
cin>>n;
map<string, map<string, int>> account;
string str;
for(int i=0; i < n; i++){
cin>>str;
stringstream ss(str);
string str_temp;
vector<string> table;
while(getline(ss, str_temp, ',')) table.push_back(str_temp);
int cur = stoi(table[3]);
if(cur >= 0 && cur <= 100)
account[table[1]][table[2]] += cur;
else
account[table[1]][table[2]] += 0;
}
int m;
cin>>m;
map<string, int> unit_price;
for(int i=0; i < m; i++){
cin>>str;
stringstream ss(str);
string str_temp;
vector<string> table;
while(getline(ss, str_temp, ',')) table.push_back(str_temp);
unit_price[table[0]] = stoi(table[1]);
}
map<string, map<string, int>>::iterator iter = account.begin();
while(iter != account.end()){
int sum = 0;
for(auto unit = iter->second.begin(); unit != iter->second.end(); unit++){
if(unit_price.count(unit->first))
sum += unit_price[unit->first]*unit->second;
}
cout<<iter->first<<','<<sum<<endl;
iter++;
}
}
int main(){
solve();
return 0;
}
第2题-相似度计算-并查集
#include<bits/stdc++.h>
#define Maxn 901
using namespace std;
int pre[Maxn], ans[Maxn];
int find(int x){
if(pre[x] == x) return x;
return pre[x] = find(pre[x]);
}
void merge(int x, int y){
int fx = find(x), fy = find(y);
if(fx != fy) pre[fy] = fx;
}
int cmp(int a, int b){
return a>b;
}
void solve(){
int n;
cin>>n;
int table[Maxn][Maxn];
for(int i=1; i <=n; i++) pre[i] = i;
for(int i=1; i <= n; i++)
for(int j=1; j <= n; j++){
cin>>table[i][j];
if(i < j && table[i][j]) merge(i, j);
}
for(int i=1; i <= n; i++)
for(int j=i+1; j <= n; j++)
if(table[i][j]) ans[find(i)] += table[i][j];
sort(ans+1, ans+n+1, cmp);
for(int i =1; i <= n; i++){
if(ans[i] == 0) break;
cout<<ans[i]<<' ';
}
}
int main(){
solve();
return 0;
}
第3题-公网下线方案-搜索(DFS/BFS)
#include <algorithm>
#include<bits/stdc++.h>
#define Maxn 30
using namespace std;
int matrix[Maxn][Maxn], vis[Maxn], n;
void dfs(int node, int p){
vis[node] = 1;
for(int i = 0; i < n; i++){
if(!vis[i] && matrix[node][i] > 0 && p >= matrix[node][i])
dfs(i, matrix[node][i]);
}
}
int cmp(int a, int b){
return a < b;
}
void solve(){
cin>>n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin>>matrix[i][j];
int exposed[Maxn], siz = 0;
int cur;
while(cin>>cur) exposed[siz++] = cur;
int minR = n, ansn;
sort(exposed, exposed+siz, cmp);
for(int i = 0; i < siz; i++){
int curR = 0;
memset(vis, 0, sizeof(vis));
for(int j = 0; j < siz; j++){
if(j == i) continue;
dfs(exposed[j], 10);
}
for(int k = 1; k <= n; k++) curR += vis[k];
if(curR < minR){
ansn = exposed[i];
minR = curR;
}
}
cout<<ansn;
}
int main(){
solve();
return 0;
}
咸鱼翻身失败