码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #503

时间:2018-08-12 14:09:36      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:stream   cti   gif   bug   first   uil   lin   \n   res   

A. New Building for SIS

ps:是真的烦。没有考虑在同一个塔里面,用了20分钟debug。

技术分享图片
#pragma warning(disable:4996)
#include<cstdio>
#include<deque>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;

inline void upd(int &x, int y) {
    x < y && (x = y);
}

int n, h, a, b, k;

int main()
{
    while (cin >> n >> h >> a >> b >> k) {
        int fa, fb, ta, tb;
        while (k--) {
            scanf("%d %d %d %d", &ta, &fa, &tb, &fb);
            if (ta == tb) {
                printf("%d\n", abs(fa - fb));
                continue;
            }
            int res;

            if ((a <= fa && fa <= b) || (a <= fb && fb <= b)) {
                res = abs(ta - tb) + abs(fa - fb);
            }
            else {
                int x = abs(fa - a) + abs(ta - tb) + abs(a - fb);
                int y = abs(fa - b) + abs(ta - tb) + abs(b - fb);
                res = min(x, y);
            }
            printf("%d\n", res);
        }

    }
    return 0;
}
View Code

B. Badge

ps:瞎写都能过

技术分享图片
#pragma warning(disable:4996)
#include<cstdio>
#include<deque>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;

inline void upd(int &x, int y) {
    x < y && (x = y);
}

int n, ans;

vector<int> G[1004];
bool use[1005];

void DFS(int u) {
    use[u] = 1;
    for (auto v : G[u]) {
        if (use[v]) {
            ans = v;
            return;
        }
        else DFS(v);
    }
}

int main()
{
    while (cin >> n) {
        for (int i = 1; i <= n; ++i) G[i].clear();
        for (int i = 1; i <= n; ++i) {
            int u;
            scanf("%d", &u);
            G[i].push_back(u);
        }
        for (int i = 1; i <= n; ++i) {
            memset(use, 0, sizeof(use));
            DFS(i);
            printf("%d ", ans);
        }
        printf("\n");
    }
    return 0;
}
View Code

C. Elections

ps:想到了解法,枚举票数,为啥能一定能得到正解呢?因为排序后,如果某个政党如果多余party党的票数,那么该政党花费最小的几个人一定会被安排。如果都安排后票数还是不够的话就从小到大收买,这样能确保得到最优解。半个小时没写出来~~~~,why?

技术分享图片
#pragma warning(disable:4996)
#include<cstdio>
#include<deque>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iostream>
#define ll long long 
using namespace std;

inline void upd(int &x, int y) {
    x < y && (x = y);
}

const int N = 3004;
const ll INF = 1000000000000000;

int n, m;
ll cnt[N], mnt[N];
bool use[N];
pair<ll,ll> so[N];

int main()
{
    while (cin >> n >> m) {
        memset(mnt, 0, sizeof(mnt));
        int ma = 0;
        for (int i = 1; i <= n; ++i) {
            ll p, c;
            scanf("%I64d %I64d", &p, &c);
            so[i].first = c;
            so[i].second = p;
            mnt[p]++;
            upd(ma, mnt[p]);
        }

        sort(so + 1, so + n + 1);

        ll ans = INF;
        for (int i = 0; i <= ma + 1; ++i) {
            ll res = 0, tot = 0;
            for (int j = 1; j <= n; ++j) cnt[so[j].second] = mnt[so[j].second];
            memset(use, 0, sizeof(use));

            for (int j = 1; j <= n; ++j) if (so[j].second != 1 && cnt[so[j].second] >= cnt[1] + i) {
                res += so[j].first;
                cnt[so[j].second]--;
                tot++;
                use[j] = 1;
            }
            if (tot > i) continue;
            for (int j = 1; j <= n; ++j) if (!use[j] && so[j].second != 1 && tot < i) {
                res += so[j].first;
                tot++;
            }

            ans = min(ans, res);
        }
        cout << ans << endl;
    }
    return 0;
}
View Code

 

Codeforces Round #503

标签:stream   cti   gif   bug   first   uil   lin   \n   res   

原文地址:https://www.cnblogs.com/zgglj-com/p/9462334.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!