其他分享
首页 > 其他分享> > 【Day4】一名菜鸟ACMer的暑假训练

【Day4】一名菜鸟ACMer的暑假训练

作者:互联网

【Day4】一名菜鸟ACMer的暑假训练

CF构造题1200-1400

D. Districts Connection

https://codeforces.com/problemset/problem/1433/D
1200
pair<帮派,编号>排序
第一个帮派的第一个成员连向不同帮派的所有成员,
第一个帮派的其他成员连向任意一个不同帮派的成员

#include <bits/stdc++.h>

using namespace std;
const int N = 5005;
typedef pair<int, int> pii;
pii a[N];

void solve () {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i ++) {
        int x;
        cin >> x;
        a[i] = {x, i};
    }
    sort (a + 1, a + n + 1);

    if (a[n].first == a[1].first) {
        cout << "NO\n";
        return ;
    }

    int i;
    set <pii> s;
    for (i = 2; i <= n; i ++) 
        if (a[i].first != a[1].first)
            break;

    //cout << "i=" << i << endl;
    
    for (int j = i; j <= n; j ++)
        s.insert ({a[1].second, a[j].second});

    for (int j = i - 1; j > 1; j --) 
        s.insert ({a[j].second, a[i].second});

    //for (auto j : s)    cout << j.first << ' ' << j.second << endl;

    if (s.size () != n - 1) cout << "NO\n";
    else {
        cout << "YES\n";
        for (auto j : s)    cout << j.first << ' ' << j.second << endl;
    }
}

int main () {
    int t;
    cin >> t;
    while (t --) {
        solve ();
    }
}

//pair<帮派,编号>排序
//第一个帮派的第一个成员连向不同帮派的所有成员,
//第一个帮派的其他成员连向任意一个不同帮派的成员

B. Random Teams

1300
https://codeforces.com/problemset/problem/478/B
阶梯型增长(故局部最大值即全局最大值)
minn:均摊 + 多出来的再均摊
maxn:1 1 1 ... n-m+1

#include <bits/stdc++.h>
#define int long long

using namespace std;

int count (int x) {
    return (x - 1) * x / 2;
}

signed main () {
    int n, m;
    cin >> n >> m;

    int x = n - m + 1;
    int maxn = count (x);

    int dx = n/m, cnt = n%m;
    //cout << dx << ' ' << cnt << endl;
    int minn = (m - cnt) * count (dx) + cnt * count (dx + 1);

    cout << minn << ' ' << maxn << endl;

}

//抽屉原理的裸题
//阶梯型增长(故局部最大值即全局最大值)
//minn:均摊 + 多出来的再均摊
//maxn:1 1 1 ... n-m+1

标签:cout,int,菜鸟,Day4,ACMer,帮派,连向,pair,成员
来源: https://www.cnblogs.com/CTing/p/16450308.html