L2-1 紧急救援
解题思路:先用SPFA求最短路,再用DFS求路径数并更新最大值和路径
参考代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 5e2 + 5;
int a[N];
bool is[N];
int g[N][N];
int dis[N];
int n, m, s, d;
int inf = 1e9;
void SPFA() {
queue<int>q;
dis[s] = 0;
is[s] = 1;
q.push(s);
while (!q.empty()) {
int now = q.front();
is[now] = 0;
q.pop();
for (int i = 0; i < n; i++) {
if (g[now][i] != inf && dis[i] > dis[now] + g[now][i]) {
dis[i] = dis[now] + g[now][i];
if (is[i] == 0) {
q.push(i);
is[i] = 1;
}
}
}
}
}
void init() {
for (int i = 0; i < n; i++) {
dis[i] = inf;
for (int j = 0; j < n; j++) {
g[i][j] = inf;
}
}
}
int cnt, mi, ma;
vector<int>ans, vv;
int res;
void dfs(int x, int step) {
if (step > mi) return;
if (x == d && step == mi) {
cnt++;
if (res > ma) {
ma = res;
ans = vv;
}
}
for (int i = 0; i < n; i++) {
if (g[x][i] != inf) {
is[i] = 1;
res += a[i];
vv.push_back(i);
dfs(i, step + g[x][i]);
vv.pop_back();
res -= a[i];
is[i] = 0;
}
}
}
int main() {
cin >> n >> m >> s >> d;
init();
for (int i = 0; i < n; i++) cin >> a[i];
int u, v, w;
for (int i = 1; i <= m; i++) {
cin >> u >> v >> w;
g[u][v] = w;
g[v][u] = w;
}
SPFA();
mi = dis[d];
for (int i = 0; i < n; i++) is[i] = 0;
vv.push_back(s);
is[s] = 1;
res = a[s];
dfs(s, 0);
cout << cnt << ' ' << ma << endl;
for (int i = 0; i < ans.size() - 1; i++) cout << ans[i] << ' ';
cout << ans.back() << endl;
return 0;
}
L2-2
解题思路:
参考代码:
L2-3 月饼
解题思路:贪心,每次卖单价最高的,排序即可
参考代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e3 + 5;
int n, d;
struct node {
double a, b;
} s[N];
bool cmp(node x, node y) {
return x.b / x.a > y.b / y.a;
}
double sum;
int main() {
cin >> n >> d;
for (int i = 1; i <= n; i++) cin >> s[i].a;
for (int i = 1; i <= n; i++) cin >> s[i].b;
sort(s + 1, s + n + 1, cmp);
for (int i = 1; i <= n; i++) {
if (s[i].a <= d) {
sum += s[i].b;
d -= s[i].a;
} else {
sum += d / s[i].a * s[i].b;
break;
}
}
printf("%.2lf\n", sum);
return 0;
}
L2-4
解题思路:
参考代码:
L2-5 集合相似度
解题思路:哈希去重,再用哈希计数统计即可
参考代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e4 + 5;
int n, q;
int a[55][N], m[N];
int main() {
cin >> n;
unordered_map<int, int>mp;
for (int i = 1; i <= n; i++) {
cin >> m[i];
mp.clear();
int cnt = 0;
int x;
for (int j = 1; j <= m[i]; j++) {
cin >> x;
if (mp[x] == 0) {
a[i][++cnt] = x;
mp[x] = 1;
}
}
m[i] = cnt;
}
cin >> q;
int x, y;
unordered_map<int, int>mp1, mp2;
while (q--) {
mp1.clear(), mp2.clear();
cin >> x >> y;
double cnt1 = 0, cnt2 = 0;
for (int i = 1; i <= m[x]; i++) mp1[a[x][i]] = 1;
for (int i = 1; i <= m[y]; i++) {
if (mp1[a[y][i]] && mp2[a[y][i]] == 0) {
mp2[a[y][i]] = 1;
cnt2++;
}
mp1[a[y][i]]++;
}
cnt1 = mp1.size();
printf("%.2lf%\n", cnt2 * 100 / cnt1 );
}
return 0;
}