CodeForces - 673B(思维)
2017-08-02 13:55
288 查看
题目链接:CodeForces - 673B
题意:数字1~n表示一堆题目,数字越大,题目越难。将题目分组,一组的任何题目都要比二组难。给出类型相似的题目,一个组中不能出现类型相似的题目。相似关系并不传递。
解法:每次给出两个类似的,大的一定进入dev1,小的一定进入dev2。每次记录dev1的最小值k1,dev2的最大值k2,这是分界点,比k1大的一定在dev1,比k2小的一定在dev2。最后剩下能变的就是k2到k1之间的值,它们的分配方法数是k1 - k2。(这个规律不方便描述,自己写写数据就知道了)
题意:数字1~n表示一堆题目,数字越大,题目越难。将题目分组,一组的任何题目都要比二组难。给出类型相似的题目,一个组中不能出现类型相似的题目。相似关系并不传递。
解法:每次给出两个类似的,大的一定进入dev1,小的一定进入dev2。每次记录dev1的最小值k1,dev2的最大值k2,这是分界点,比k1大的一定在dev1,比k2小的一定在dev2。最后剩下能变的就是k2到k1之间的值,它们的分配方法数是k1 - k2。(这个规律不方便描述,自己写写数据就知道了)
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; int n, m; bool ok = true; //能不能分组 map<int, int> M1; map<int, int> M2; int main() { scanf("%d%d", &n, &m); int k1 = n, k2 = 1; //k1 记录当前dev1的最小值,k2 记录当前dev2的最大值 for (int i = 0, u, v; i < m; i++) { scanf("%d%d", &u, &v); if (ok) { int x = max(u, v); //较大的一定进入dev1 int y = min(u, v); //较小的一定进入dev2 if (M2[x] != 0 || M1[y] != 0) ok = false; //如果已经出现过则不能分 else if (x < k2 || y > k1) ok = false; //如果大的小于当前dev2最大值或小的大于dev1的最小值则不能分 else { k1 = min(k1, x); k2 = max(k2, y); M1[x] = 1; M2[y] = 1; } } } if (ok) printf("%d\n", k1 - k2); else printf("0\n"); return 0; }
相关文章推荐
- codeforces 673D(思维)
- CodeForces - 567D One-Dimensional Battle Ships —— 二分思维
- Codeforces - 777A. Shell Game 思维或者模拟
- Codeforces 106D Treasure Island【思维+二维前缀和】
- codeforces 814D An overnight dance in discotheque(几何思维)
- codeforces 836D(思维题)
- 【数学思维】CodeForces - 233B Non-square Equation
- Codeforces 817C Really Big Numbers【思维+二分】
- Codeforces 639C Bear and Polynomials 【思维】
- Codeforces 638C Road Improvement(思维+Dfs~)
- Codeforces 322D Ciel and Duel【思维+费用流】
- Codeforces 230E Triangles【思维】
- Codeforces 135A-Replacement(思维)
- codeforces 714C Sonya and Queries [思维]【STL】
- Codeforces 371C - Sonya and Queries(思维)
- Codeforces 389D Fox and Minimal path【构造+二进制思维】好题!
- CodeForces - 417A(思维题)
- 【CodeForces】500B - New Year Permutation(思维)
- Codeforces 821D Okabe and City (拆点+思维建图+spfa)
- 【codeforces B + 思维】