• Codeforces Round #692 C. Peaceful Rooks


    Codeforces Round #692 (Div. 2, based on Technocup 2021 Elimination Round 3)

    C. Peaceful Rooks

    题意

    给你一个n*n的表格和m个(m<n)棋子,棋子不会在同一行或同一列中出现两个,问你最少要多少步才能将其全部移到主对角的位置

    思路

    起初想的是我去判断少量的点,来判断他的特殊性,然后我发现(2,3),(3,2)这样的坐标点需要3次,然后如果不是横纵坐标刚好相反的点,但是其所在位置的对角线位置横纵坐标均有棋子存在,那么这样的点需要移动棋子个数+1次。如果我去前后均考虑少量的点而且画在一个平面,我可能是会看出来这种规律,也就是说以后需要去考虑少量的点的排列组合比如说2种点然后组合到一起观察

    正解:

    ​ 形成环则+1

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e5 + 10;
    int f[N];
    int find(int x) {
        if (x != f[x]) f[x] = find(f[x]);
        return f[x];
    }
    void solve() {
        int n, m; cin >> n >> m;
        for (int i = 1; i <= n; ++i) f[i] = i;
        int cnt = 0, ans = m;
        for (int i = 1; i <= m; ++i) {
            int x, y; cin >> x >> y;
            if (x == y) {
                --ans; continue;
            }
            int fx = find(x), fy = find(y);
            if (fx == fy) ++cnt;
            f[fx] = fy;
        }
        cout << ans + cnt << endl;
    }
    signed main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	int T = 1;
    	 cin >> T;
    	while (T--) {
    		solve();
    	}
    
    }
    

    错误代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e5 + 10;
    bool row[N], col[N];
    bool is_row[N], is_col[N];
    void solve() {
    	int n, m; cin >> n >> m;
    	for (int i = 0 ; i <= n; ++i){
    		row[i] = col[i] = is_row[i] = is_col[i] =false;
    	}
    	int cnt = 0;
    	vector<pair<int,int>>op;
    	map<pair<int,int>, bool>mt;
    	int f1 = 0;
    	int q = m;
    	while (m--) {
    		int x, y; cin >> x >> y;
    		mt[{x, y}] = 1;
    		op.push_back({x, y});
    		if (mt[{y, x}] == 1 && x != y) {
                f1++;continue;
    		}
    		if (row[y])is_row[x] = 1;
    		if (col[x])is_col[y] = 1;
    		row[x] = 1, col[y] = 1;
    		if (x == y) ++ cnt;
    	}
    	int f = 0;
    	for (auto i : op) {
    		if (is_row[i.first] && is_col[i.second])f++;
    	}
    	if (f1 == 0 && f){
    		cout << (q - cnt + 1) << endl;
    	}else if (f1 && f == 0) cout << f1 * 3 << endl;
    	else if (f1 && f) cout << (f1 * 3 + (q - cnt - 2 * f1 + 1)) << endl;
    	else cout << q - cnt << endl;
    }
    signed main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	int T = 1;
    	 cin >> T;
    	while (T--) {
    		solve();
    	}
    
    }
    
  • 相关阅读:
    【nodejs】使用Node.js实现REST Client调用REST API
    [Groovy] Groovy && JNI
    一些很实用的Maven Plugins
    秋天到了
    今天头好疼
    想起那个人的时候
    不知道标题
    生活让我懂得
    显示实现接口和实现接口
    Foreach原理
  • 原文地址:https://www.cnblogs.com/waryan/p/14312178.html
Copyright © 2020-2023  润新知