OVSolitario-io

导航

题目总结

奶牛野餐:奶牛野餐
题意:找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;
           }
       }
   }

posted on 2025-08-24 09:31  TBeauty  阅读(7)  评论(0)    收藏  举报