刷题之Educational Codeforces Round 124 (Rated for Div. 2)

刷题之Educational Codeforces Round 124 (Rated for Div. 2)

题单链接:Educational Codeforces Round 124 (Rated for Div. 2)

1651A. Playoff

  • 思路:最后出线的是编号 2 n − 1 2^n-1 2n1 的球员。
#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long
#define db double
#define VI vector<int>
#define PII pair<int, int>
const db Pi = 3.141592653589793;
const int INF = 0x7fffffff;
const int N = 1e5 + 5;
const db eps = 1e-10;
int cas, n, m, a[N];
int main(){
    cin >> cas;
    while(cas--){
        cin >> n;
        cout << ((1 << n) - 1) << endl;
    }
}

1651B. Prove Him Wrong

  • 思路:不妨设 a i < a j a_i<a_j ai<aj,要使 a i + a j > 2 ∣ a i − a j ∣ = 2 ( a j − a i ) a_i+a_j>2|a_i-a_j|=2(a_j-a_i) ai+aj>2aiaj=2(ajai),则 3 a i > a j 3a_i> a_j 3ai>aj
    • 于是举出反例,只需要 3 a i ≤ a j 3a_i\le a_j 3aiaj
    • 又因为 1 ≤ a j ≤ 1 0 9 1\le a_j\le 10^9 1aj109,发现 3 19 > 1 0 9 3^{19}>10^9 319>109,于是当 n ≥ 20 n\ge 20 n20 时, a n > 1 0 9 a_n>10^9 an>109,无解
    • 否则按照 3 3 3 为等比的等比数列输出即可。
#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long
#define db double
#define VI vector<int>
#define PII pair<int, int>
const db Pi = 3.141592653589793;
const int INF = 0x7fffffff;
const int N = 1e5 + 5;
const db eps = 1e-10;
int cas, n;
int main(){
    cin >> cas;
    while(cas--){
        cin >> n;
        if(n >= 20) puts("NO");
        else{
            ll now = 1;
            puts("YES");
            cout << 1 << " ";
            rep(i, 2, n){
                now *= 3;
                cout << now << " ";
            }
            cout << endl;
        }
    }
}

1651C. Fault-tolerant Network

  • 思路:要求任意一个机器故障,不会将网络分成多个部分。则四个机器 a [ 1 ] , a [ n ] , b [ 1 ] , b [ n ] a[1],a[n],b[1],b[n] a[1],a[n],b[1],b[n] 点一定要连接。四个点至少练两条线,至多四条线。
    • 两条线(两种情况)
      1. a [ 1 ] − > b [ 1 ] , a [ n ] − > b [ n ] a[1]->b[1],a[n]->b[n] a[1]>b[1],a[n]>b[n]
      2. a [ 1 ] − > b [ n ] , a [ n ] − > b [ 1 ] a[1]->b[n],a[n]->b[1] a[1]>b[n],a[n]>b[1]
    • 三条线(四种情况)
      1. a [ 1 ] − > b [ 1 ] a[1]->b[1] a[1]>b[1] 时, a [ n ] , b [ n ] a[n],b[n] a[n],b[n] 选择最佳位置
      2. a [ 1 ] − > b [ n ] a[1]->b[n] a[1]>b[n] 时, a [ n ] , b [ 1 ] a[n],b[1] a[n],b[1] 选择最佳位置。
      3. a [ n ] − > b [ 1 ] a[n]->b[1] a[n]>b[1] 时, a [ 1 ] , b [ n ] a[1],b[n] a[1],b[n] 选择最佳位置
      4. a [ n ] − > b [ n ] a[n]->b[n] a[n]>b[n] 时, a [ 1 ] , b [ 1 ] a[1],b[1] a[1],b[1] 选择最佳位置
    • 四条线(一种情况)
      1. a [ 1 ] , b [ 1 ] , a [ n ] , b [ n ] a[1],b[1],a[n],b[n] a[1],b[1],a[n],b[n] 各自选择最佳位置
#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long
#define db double
#define VI vector<int>
#define PII pair<int, int>
const db Pi = 3.141592653589793;
const int INF = 0x7fffffff;
const int N = 2e5 + 5;
const db eps = 1e-10;
int cas, n;
ll a[N], b[N];
ll ans, a1, an, b1, bn;
bool check(int x, int p1, int p2){
    return abs(b[p1] - x) == abs(b[p2] - x);
}
ll calc(int x, int y){
    return abs(a[x] - b[y]);
}
int main(){
    // freopen("1.in","r",stdin);
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin >> cas;
    while(cas--){
        cin >> n;
        rep(i, 1, n) cin >> a[i];
        rep(i, 1, n) cin >> b[i];
        //预处理
        a1 = an = b1 = bn = INF;
        rep(i, 1, n){
            a1 = min(a1, calc(1, i));
            an = min(an, calc(n, i));
            b1 = min(b1, calc(i, 1));
            bn = min(bn, calc(i, n));
        }
        //二线
        ans = min(calc(1, 1) + calc(n, n), calc(1, n) + calc(n, 1));
        //三线
        ans = min(ans, calc(1, 1) + an + bn);
        ans = min(ans, calc(1, n) + an + b1);
        ans = min(ans, calc(n, 1) + a1 + bn);
        ans = min(ans, calc(n, n) + a1 + b1);
        //四线
        ans = min(ans, a1 + an + b1 + bn);
        cout << ans << endl;
    }
}
/*
2
3
1 10 1
20 4 25
4
1 1 1 1
1000000000 1000000000 1000000000 1000000000
*/

1651D. Nearest Excluded Points

  • 知识点:多源BFS

  • 思路:记录所有点周围上下左右四点中未标记的点。从这些点开始进行 BFS。每次遇到标记点还未赋值答案,便赋值,再加入队列即可。

#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long
#define db double
#define VI vector<int>
#define PII pair<int, int>
const db Pi = 3.141592653589793;
const int INF = 0x7fffffff;
const int N = 2e5 + 5;
const db eps = 1e-10;
int n, x[N], y[N];
int dx[5] = {0, 0, 1, -1};
int dy[5] = {-1, 1, 0, 0};
map<PII, int> mp;
queue<PII> q;
map<PII, PII> ans;
void bfs(){
    while(q.size()){
        PII now = q.front(); q.pop();
        rep(j, 0, 3){
            int nxtx = now.first + dx[j], nxty = now.second + dy[j];
            if(mp.count({nxtx, nxty}) && !ans.count({nxtx, nxty})){
                ans[{nxtx, nxty}] = ans[{now.first, now.second}];
                q.push({nxtx, nxty});
            }
        }
    }
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin >> n;
    rep(i, 1, n){
        cin >> x[i] >> y[i];
        mp[{x[i], y[i]}] = 1;
    }
    //初始化队列
    rep(i, 1, n){
        rep(j, 0, 3){
            int nxtx = x[i] + dx[j], nxty = y[i] + dy[j];
            if(mp.count({nxtx, nxty})) continue;
            q.push({nxtx, nxty});
            ans[{nxtx, nxty}] = {nxtx, nxty};
            break;
        }
    }
    bfs();
    rep(i, 1, n){
        PII t = ans[{x[i], y[i]}];
        cout << t.first << " " << t.second << endl;
    }
}
/*
6
2 2
1 2
2 1
3 2
2 3
5 5

8
4 4
2 4
2 2
2 3
1 4
4 2
1 3
3 3
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值