SOJ 1021 Couples

题目大意:n(1 ≤ n ≤ 100000)对夫妻形成环,编号为1到2n。相邻的夫妻能够从环中删除,若能删除全部夫妻,则输出Yes,否则输出No。有多组测试样式,当n等于0时,输入结束。

解题思路:逆向思维,在生成环的过程进行处理,而不是在生成环后再删除夫妻。

       用到的数据结构:栈。

代码如下:

#include <iostream>
#include <stack>
#include <map>
using namespace std;

int main() {
    int n, nn;
    while (cin >> n, n != 0) {
        stack<int> st;
        map<int, int> m;

        // 读入夫妻对
        int w, h;
        for (int i = 0; i < n; i++) {
            cin >> w >> h;
            m[w] = h;
            m[h] = w;
        }

        nn = n * 2;
        for (int i = 1; i <= nn; i++) {    // 夫妻编号从1开始到n*2
            if (!st.empty() && st.top() == m[i]) {
                st.pop();
            } else {
                st.push(i);
            }
        }

        if (st.empty()) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
    }

    return 0;
}
时间: 2024-12-21 19:32:34

SOJ 1021 Couples的相关文章

sicily 1021. Couples

这个题就用stack来解决啦,如果一个用例中的couple可以全部移走,则将环拆成链后最后的一对couple依然相邻,可以全部移走,因此将环拆成一个链来解决不影响结果: #include <iostream> #include <stack> using namespace std; int couple_relation[200005]; int main() { int t1, t2, n,i; while (scanf("%d", &n) &

Sicily 1021 Couple

1021. Couples Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description N couples are standing in a circle, numbered consecutively clockwise from 1 to 2N. Husband and wife do not always stand together. We remove the couples who stand together u

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

1021. Deepest Root (25) 并查集&amp;&amp;DFS

1021. Deepest Root (25) 时间限制 1500 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root t

HDU 1021[Fibonacci Again]规律

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1021 题目大意:首两项为7,11的斐波那契数列.若第n项能被3整除,输出yes,否则输出no 关键思想:模三加法情况有限,找规律. 代码如下: #include <iostream> using namespace std; int main(){ int n; while(cin>>n) if(n%8==2||n%8==6)cout<<"yes"<

BZOJ 1021: [SHOI2008]Debt 循环的债务( dp )

dp(i, j, k)表示考虑了前i种钱币(从小到大), Alice的钱数为j, Bob的钱数为k, 最小次数. 脑补一下可以发现, 只有A->B.C, B->A.C, C->A.B, A.B->C, A.C->B, B.C->A 6情况, 枚举然后dp一下就OK了. dp用刷表的话,有个强有力的剪枝是之后的硬币无论如何组合都无法满足时不去更新. --------------------------------------------------------------

SOJ 4445 2015四川省赛模拟题

背景:赛场上就是因为没开这道题,而没拿到银,回来A了,感觉代码能力还是很弱,一定要先想好再敲,而且注重代码的函数化,这样无论是观感,还是调试都要好很多,逻辑要清晰,看代码要仔细,提交之前通读代码. 题意:起点在原点的frog,开始向右运动,且碰到障碍物就右转,问转多少次? 思路:关键是图的大小范围是109,无法存下,只有用类似链表的方法来存图.这里用了两个容器,一个以X为基准,一个一Y为基准,这两个容器设置很特殊,是为了满足题中特殊的查询需要:查询前进方向最近障碍物. 我的代码: #includ

【BZOJ】【1021】【SHOI2008】Dept循环的债务

DP 去膜拜题解了>_>玛雅原来是动规…… 让我先理解一下为什么要用动规:这个题根据钱数推方案其实是无从下手的……(线性规划?……事实证明我想多了) 啦-我们先来看个超级简化版的问题:怎么判无法还清?正着判很麻烦对不对= =(其实是我没想……) 那么我们倒着来考虑:有哪些状态是我们通过交换钱币能够到达的,这个可以递推对不>_> 现在我们就知道哪些状态我们是可以到达的了……再多想一下……递推……如果我们依次考虑每种面额的交换策略,顺便也就知道了我们到达这个状态的最小交换次数对吧? 原

1021. 个位数统计

1 /* 2 * Main.c 3 * 1021. 个位数统计 4 * Created on: 2014年8月30日 5 * Author: Boomkeeper 6 ********测试通过****** 7 */ 8 9 #include <stdio.h> 10 #include <string.h> 11 12 int main(void){ 13 14 char str[1001]; 15 int num[10]={-1}; 16 int len; 17 int i; 18