题目总结
奶牛野餐:奶牛野餐
题意:找all奶牛可到达点,若一个点可以被all奶牛到达,那么到达次数一定是all的k只奶牛数,记录每个点访问次数,为k则可被all奶牛到达
将all点合并,跑汇聚点
为什么排序之后会报错呢?
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define N 1010
vector<int> q[N];
int k, n, m, a[N], u, v, f[N], ans;
bool vis[N];
int dfs(int u, int k) {
if(f[u] != 0 && u != k) return u;
for(int i = 0; i < q[u].size(); ++ i) {
if(!vis[q[u][i]]) {
vis[q[u][i]] = 1;
int res = dfs(q[u][i], k);
if (res != k) return res;
}
}
return k;
}
void dfs1(int x) {
ans += 1;
for(int i = 0; i < q[x].size(); ++ i) {
if(!vis[q[x][i]]) {
vis[q[x][i]] = 1;
dfs1(q[x][i]);
}
}
}
int main() {
cin >> k >> n >> m;
for(int i = 1; i <= k; ++ i) cin >> a[i], f[a[i]] ++;
// sort(a + 1, a + 1 + k);排序则错误,为什么错误?
while(m -- ) {
cin >> u >> v;
q[u].push_back(v);
}
for(int i = 1; i < k; ++ i) {
memset(vis, 0, sizeof vis);
vis[a[i]] = 1;
int x = a[i];
a[i] = dfs(a[i], a[i]);
if(x != a[i]) {
f[x] = 0;//防止为>1的数清零失败
f[a[i]] ++;
}
}
memset(vis, 0, sizeof vis);
vis[a[k]] = 1;
dfs1(a[k]);
cout << ans << endl;
return 0;
}
直播获奖:直播获奖
数据范围限定为600以下非负整数(较小空间),则可以直接暴力求和,时复为O(An),(A为最大成绩)
for(int i = 1; i <= n; ++ i) {
cin >> x, q[x] ++;//对应人数+1
int sum = 0;
for(int j = 600; j >= 0; -- j) {//统计截止到此分数的人数
sum += q[j];
if(sum >= max(1, i * w / 100)) {
cout << j << ' ';
break;
}
}
}
浙公网安备 33010602011771号