Codeforces 555A Case of Matryoshkas 套娃娃

题意:有n个玩具娃娃,编号为1 ~ n。要求一条链子上的娃娃必须满足编号小的娃娃套在编号大的娃娃上。规定两种操作:1、拆下编号最大的娃娃。2、将一条链上的娃娃套在一个没有套在任何其他链子上的娃娃上(有点绕)。意思就是比如有一条链1→2→4→5,你可以拆下5,然后变成两条链1→2→4和5,或者将这条链套在6上,但是6不能已经套在任何其他链子上,变成1→2→4→5→6。题目要求用最少的操作步数将所有的娃娃套在一个链子上。

想清楚了其实还是蛮简单的。每个娃娃最多只需要两次步骤——拆和套。我们可以这样想。编号为1的娃娃所在的那条链子上,1是不需要拆下来的。也就是不用进行任何操作。如果1套在2上,那么2也不用拆下来,再接着如果2套在3上,那么3也不用拆 ...... 以此类推,这条链上从1开始连续的数字都是不用拆的。直到某个地方不连续,比如1→2→3→4→6→7→8,其中4套在6上,那么5肯定在别的链子上,需要把6(包括6)以后的所有娃娃都拆下来,然后把5接上去,再把6 7 8接上去。由此看来,这条链上从1开始连续的数字不用拆。一旦遇到不连续,则从这个不连续的娃娃开始后面的全部都要拆。对于其他的链子,我们设编号最小的娃娃为A,因为它不是1,所以有比它更小的娃娃需要套在A上面,然而题目规定套娃娃的时候A不能已经套在其他的娃娃上,而A又是这条链上最小的娃娃,所以这条链上除了A以外的娃娃全部都要拆下来。由此看来,其他的链子上必须每条链子都完全拆卸。而每条链子上的最小的娃娃不用拆,但是需要套。对于需要拆的娃娃,必须要操作2次,即拆+套。对于不需要拆但需要套的娃娃,需要操作1次。对于既不用拆也不用套的娃娃,不需要操作。这样直接计算即可。可以证明这样肯定是最少的操作步数。一方面,这是至少需要的步数,另一方面,除了从1开始连续的数没被拆掉,剩下所有的娃娃都被拆成了单个。所以直接按编号顺序一个个套即可,不需要多余的步骤,因此这一定是最小步数的操作。

设编号为1的娃娃所在的链子上从1开始连续的数字一共有cnt个,那么答案为2*(n - cnt - (k - 1)) + 1*(k - 1) = 2*(n - cnt) - k + 1即公式。于是我们只需要求出cnt再用公式计算即可。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
using namespace std;

const int MAX = 100005;
int n, k;

void solve()
{
    int m, x, temp, cnt = 1, ans = 2*n - k + 1;
    bool flag;
    while(k--)
    {
        scanf("%d", &m);
        scanf("%d", &x);
        if(x == 1)
            flag = true;
        else
            flag = false;
        temp = x;
        while(--m)
        {
            scanf("%d", &x);
            if(x != temp + 1)
                flag = false;
            if(flag)
                cnt++;
            temp = x;
        }
    }
    printf("%d\n", ans - 2*cnt);
}

int main()
{
    while(scanf("%d%d", &n, &k) != EOF)
        solve();

    return 0;
}



时间: 2024-10-06 03:31:30

Codeforces 555A Case of Matryoshkas 套娃娃的相关文章

CodeForces - 556C Case of Matryoshkas

Andrewid the Android is a galaxy-famous detective. He is now investigating the case of vandalism at the exhibition of contemporary art. The main exhibit is a construction of n matryoshka dolls that can be nested one into another. The matryoshka dolls

贪心/思维题 Codeforces Round #310 (Div. 2) C. Case of Matryoshkas

题目传送门 1 /* 2 题意:套娃娃,可以套一个单独的娃娃,或者把最后面的娃娃取出,最后使得0-1-2-...-(n-1),问最少要几步 3 贪心/思维题:娃娃的状态:取出+套上(2),套上(1), 已套上(0),先从1开始找到已经套好的娃娃层数, 4 其他是2次操作,还要减去k-1个娃娃是只要套上就可以 5 详细解释:http://blog.csdn.net/firstlucker/article/details/46671251 6 */ 7 #include <cstdio> 8 #i

Codeforces Round #310 (Div. 1)——A水——Case of Matryoshkas

Andrewid the Android is a galaxy-famous detective. He is now investigating the case of vandalism at the exhibition of contemporary art. The main exhibit is a construction of n matryoshka dolls that can be nested one into another. The matryoshka dolls

codeforces 555B Case of Fugitive

题目连接: http://codeforces.com/problemset/problem/555/B 题目大意: 有n个岛屿(岛屿在一列上,可以看做是线性的,用来描述岛屿位置的是起点与终点),m个桥,给出每个岛屿的位置和桥的长度,问是否可以把n个岛屿连起来? 解题思路: 排序+贪心,对于n个岛屿,相邻的两个之间起点和端点可以转化为n-1个连接桥的长度区间,把区间升序排列. 对于m个桥升序排列,对于每一个桥枚举每个可以合法覆盖的区间,选取最优的,选取的时候满足L<bridge_length<

codeforces 556B. Case of Fake Numbers 解题报告

题目链接:http://codeforces.com/problemset/problem/556/B 题目意思:给出 n 个齿轮,每个齿轮有 n 个 teeth,逆时针排列,编号为0 ~ n-1.每按一次 button,每个齿轮都会有且仅有一个活动的tooth,对于偶数编号的齿轮,它下一个活动tooth是紧挨着当前tooth的逆时针方向的那个:而奇数编号的齿轮,下一个活动tooth是顺时针的那个.给出每个齿轮的活动tooth,问通过按下有限次的button,问能不能得到一个0,1,...,n-

Codeforces 556D - Case of Fugitive

556D - Case of Fugitive 思路:将桥长度放进二叉搜索树中(multiset),相邻两岛距离按上限排序,然后二分查找桥长度匹配并删除. 代码: #include<bits/stdc++.h> using namespace std; #define ll long long const int N=2e5+5; struct node { ll x; ll y; int id; bool operator <(const node &a)const { ret

CodeForces - 556D Case of Fugitive (贪心+排序)

Andrewid the Android is a galaxy-famous detective. He is now chasing a criminal hiding on the planet Oxa-5, the planet almost fully covered with water. The only dry land there is an archipelago of n narrow islands located in a row. For more comfort l

CodeForces 555E Case of Computer Network

题意: n(2*10^5)个点m(2*10^5)条边的无向图  要求给无向边定向  使得最后的有向图满足q(2*10^5)个指令  每个指令表示为s->e  即s到e有通路  问  是否有可能 思路: 假设无向图中有圈  那么定向时一定也定成圈  因此想到连通分量概念  容易分析出只有桥的定向才值得讨论  因此可以先对图做边连通分量缩点 由于题中提示图可能不连通  因此得到了森林 我们要解决的就是  根据q个指令(每个指令对应一个线路  树上线路唯一)  将这些线路放在树上  如果某条树边必须保

Codeforces 556A Case of the Zeros and Ones 消除01串

题意:给出一个只由0和1组成的串,每次操作可以选择两个相邻的位置且这两个位置一个为0,一个为1(顺序无所谓)并删去这两个位置得到一个新串,然后可以对新串继续操作.操作次数无限制,令原串的长度不断缩短直至不能再短.求这个最短的长度为多少. 虽然题目不难,不过还是证明一下自己思路的正确性.这里我主要是想说一下证明的思路.直观上看,只要发现两个相邻的是0和1就把它删去,不用考虑不同的删法会不会对后面造成影响.比如有如下串:.......101........ 删掉10和删掉01都无所谓.这里我们证明一