• 2020/3/19 刷题


    最终刷题太多了博客思路慢慢更新

    1.利用havel定理判断可不可以简单图化的一道好题

    Sample Input
    
        3
        7
        4 3 1 5 4 2 1 
        6
        4 3 1 4 2 0 
        6
        2 3 1 1 2 1 
    
    Sample Output
    
        YES
        0 1 0 1 1 0 1 
        1 0 0 1 1 0 0 
        0 0 0 1 0 0 0 
        1 1 1 0 1 1 0 
        1 1 0 1 0 1 0 
        0 0 0 1 1 0 0 
        1 0 0 0 0 0 0 
    
        NO
    
        YES
        0 1 0 0 1 0 
        1 0 0 1 1 0 
        0 0 0 0 0 1 
        0 1 0 0 0 0 
        1 1 0 0 0 0 
        0 0 1 0 0 0 
    
    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    bool MAP[15][15];
    typedef pair<int, int> P;
    std::vector<P> v;
    bool cmp1(const P& p1, const P& p2) {
    	return p1.second > p2.second;
    }
    int main (){
    	int n;
    	cin >> n;
    	while(n--) {
    		v.clear();
    		memset(MAP, 0, sizeof(MAP));
    		int m;
    		cin >> m;
    		for(int i = 1; i <= m; ++i) {
    			int temp;
    			cin >> temp;
    			v.push_back(P(i, temp));
    		}
    		//sort(v.begin(), v.end(), cmp1);
    		// for(int i = 0; i < m; ++i) 
    		// {
    		// 	cout << v[i].second << " "; 
    		// }
    		bool flag = 0;
    		for(int i = 0; i < m; ++i) {
    			sort(v.begin() + i, v.end(), cmp1);
    			for(int j = 0; j < v[i].second; ++j) {
    				if(i + 1 + j < m){
    					v[i + 1 + j].second--;
    					if(v[i+1+j].second < 0){
    						flag = 1;
    						break;
    					}
    					MAP[v[i].first][v[i+1+j].first] = 1;
    					MAP[v[i+1+j].first][v[i].first] = 1;
    				}
    				else {
    					flag = 1;
    					break;
    				}
    			}
    			if(flag) {
    				break;
    			}
    		}
    		if(v[m - 1].second == 1) {
    			flag = 1;
    		}
    		if(flag) {
    			cout << "NO" << endl;
    		}
    		else {
    			cout << "YES" << endl;
    			for(int i = 1; i <= m; ++i) {
    				for(int j = 1; j <= m; ++j) {
    					cout << MAP[i][j] << " ";
    				}
    				cout << endl;
    			}
    		}
    		if(n != 0) {
    			cout << endl;
    		}
    	}
    }
    

     2.

    Sample Input
    
        4
        1 2
        3 4
        5 6
        1 6
        4
        1 2
        3 4
        5 6
        7 8
    
    Sample Output
    
        4
        2
    
    //并查集裸题
    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 10000005;
    int ans;
    int fa[MAXN];
    int num[MAXN];
    void init() {
    	for(int i = 1; i <= 10000000; ++i) {
    		fa[i] = i;
    		num[i] = 1;
    	}
    }
    int find(int x) {
    	return x == fa[x] ? x : (fa[x] = find(fa[x]));
    }
    void merge(int i, int j) {
    	int x = find(i);
    	int y = find(j);
    	if(x != y) {
    		fa[x] = y;
    		num[y] += num[x];	//合并十分关键
    	}
    }
    int main () {
    	int m;
    	while(cin >> m) {
    		if(!m){
    			cout << 1 << endl;
    			continue;
    		}
    		init();
    		int mm = 0;
    		while(m--) {
    			int A, B;
    			cin >> A >> B;
    			mm = max(max(A,B), mm);
    			merge(A, B);
    		}
    		int temp = 0;
    		for(int i = 1; i <= mm; ++i) {
    			temp = max(num[i], temp);
    		}
    		cout << temp << endl;
    	}
    }
    

     3.

    Sample Input
    
        1 1
        1 1
        2 1
        1 2
    
    Sample Output
    
        1
        26
    
    //特别好的一道思维题。并查集加快速幂
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll MODE = 1000000007;
    const int MAXN = 1e7 + 5;
    int fa[MAXN];
    void init() {
    	for(int i = 0; i <= 10000000; ++i) {
    		fa[i] = i;
    	}
    }
    
    ll find(ll x) {
    	return x == fa[x] ? x : (fa[x] = find(fa[x]));
    }
    
    int merge(ll i, ll j) {
    	ll x = find(i);
    	ll y = find(j);
    	if(x != y) {
    		fa[x] = y;
    		return 1;
    	}
    	return 0;
    }
    ll qpower(ll a, ll b) {
    	ll r = 1;
    	while(b) {
    		if(b & 1) {
    			r = (r * a) % MODE;
    		}
    		a = (a * a) % MODE;
    		b >>= 1;
    	}
    	return r;
    }
    
    int main () {
    	ll N, M;
    	while(cin >> N >> M) {
    		init();
    		while(M--) {
    			ll L, R;
    			cin >> L >> R;
    			N -= merge(L - 1, R);
    		}
    		cout << qpower(26, N) << endl;	
    	}
    }
    

     4.

    //白给题
    #include <bits/stdc++.h>
    using namespace std;
    multimap<int, int> e;
    int main () {
    	int n;
    	while(cin >> n && n) {
    		e.clear();
    		for(int i = 0; i < n; ++i) {
    			int f, t;
    			cin >> f >> t;
    			bool flag = true;
    			for(multimap<int, int>::iterator i = e.find(t); i != e.end() && i -> first == t; ++i) {
    				if(i -> second == f) {
    					e.erase(i);
    					flag = false;
    					break;
    				}
    			}
    			if(flag) {
    				e.insert(make_pair(f, t));
    			}
    		}
    		if(e.empty()) {
    			cout << "YES" << endl;
    		}
    		else cout << "NO" << endl;
    	}
    }
    

     5.

    #include <bits/stdc++.h>
    using namespace std;
    double dp[2][105];
    int main () {
    	int n, m, c;
    	dp[0][0] = 1;
    	while(cin >> n >> m >> c && (n + m)) {
    		for(int i = 1; i <= c; ++i) {
    //dp[0][C]代表总共有C个糖 按如上处理最后是偶数的概率
    //dp[1][C]代表总共有C个糖 按如上处理最后是偶数的概率
    /*
    状态转移方程是 此时最后是偶数的概率等于 
    原来是奇数的概率乘以这个糖落在n的部分概率即n/m+n 
    加上 原来是偶数的概率乘以这个糖落在n的部分概率即m/m+n
    */
    			dp[0][i] = dp[1][i-1] * (n/(n+m+0.0)) + 
    			dp[0][i-1]*(m/(n+m+0.0));
    
    			dp[1][i] = dp[0][i-1]*(n/(n+m+0.0)) +
    			dp[1][i-1]*(m/(n+m+0.0));
    		}
    		cout << setprecision(8) << dp[0][c] << endl;
    	}
    }
    
    作者:LightAc
    出处:https://www.cnblogs.com/lightac/
    联系:
    Email: dzz@stu.ouc.edu.cn
    QQ: 1171613053
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    vim for python配置
    Python学习的一些好资料
    【Python开发实战】Python环境的配置
    【Python开发实战】Windows7+VirtualBox+Ubuntu环境配置
    linux下shapely的安装
    【python常用模块】os.path
    linux下gdal的python包的安装
    由二叉树的前序遍历和中序遍历,求其后序遍历
    ASCII码表
    C++标准库函数之排列函数
  • 原文地址:https://www.cnblogs.com/lightac/p/12520934.html
Copyright © 2020-2023  润新知