codeforces 1303 题解(更新中)

codeforces 1303 题解

A. Erasing Zeroes

想让字符串中的 \(1\) 连续,而我们能做的只有删 \(0\) ,则需要删去除开头以及结尾外的 所有 \(0\) 块。所以从头扫一遍统计开头 \(0\) 块,从尾扫一遍统计结尾 \(0\) 块,再用 \(0\) 的数量减去这两部分即可,可能为负所以跟 \(0\) 取最大值。

时间复杂度 \(O(n)\)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define _for(i,a,b) for(int i = (a);i < b;i ++)
#define _rep(i,a,b) for(int i = (a);i > b;i --)
#define INF 0x3f3f3f3f
#define ZHUO 11100000007
#define MOD 1000000007
#define MIKUNUM 39
#define pb push_back
#define debug() printf("Miku Check OK!\n")
#define maxn 239
#define X first
#define Y second

int main()
{
    ios::sync_with_stdio(false);

    int t;
    cin >> t;
    while(t--)
    {
        string s;
        cin >> s;

        int stzero = 0, endzero = 0;
        int zerocnt = 0;
        _for(i,0,s.size())
            if(s[i]=='0')
                zerocnt ++;

        _for(i,0,s.size())
            if(s[i]=='1')
                break;
            else
                stzero ++;

        _rep(i,s.size()-1,-1)
            if(s[i]=='1')
                break;
            else
                endzero ++;
        printf("%d\n",max(0,zerocnt-endzero-stzero));
    }
    return 0;
}

B. National Project

铺水泥,要求高质量水泥天数在 \(\left \lceil \frac{n}{2} \right \rceil\) 及以上,那其实我们可以假设要求 \(\left \lceil \frac{n}{2} \right \rceil\) 都是高质量水泥,然后和 \(n\) 取最大值即是答案。问题是要求 \(\left \lceil \frac{n}{2} \right \rceil\) 全是高质量水泥的天数怎么求?

我们可以将 \(g+b\) 这个值打包成一个 组 ,因为他们是连续的。如果要求全是高质量水泥,答案至少应该包含最大可能的 组 值,然后再来一些 \(g\) 来凑。说的有点抽象,具体一点就是比如现在要求 \(20\)天 高质量水泥,\(g==6,b==3\) ,则 组 就是 \(9\) ,你至少需要 \(3\) 组,再来 \(20-3×6=2\) 个零散的 \(g\) 来凑就能凑够 \(20\) 天高质量水泥,也就是 \(3×9+2=29\) 天。

特殊考虑 \(n|g\) 的情况即可。

PS:样例中一百万天坏天气震撼我心。

时间复杂度 \(O(1)\)。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define _for(i,a,b) for(int i = (a);i < b;i ++)
#define _rep(i,a,b) for(int i = (a);i > b;i --)
#define INF 0x3f3f3f3f
#define ZHUO 11100000007
#define MOD 1000000007
#define MIKUNUM 39
#define pb push_back
#define debug() printf("Miku Check OK!\n")
#define maxn 239
#define X first
#define Y second

ll n, g, b, rnt;
int main()
{
    ios::sync_with_stdio(false);
    int T;
    cin >> T;
    while(T--)
    {
        cin >> n >> g >> b;
        ll tmpn = n/2 + (n&0x1);
        ll curhaveg = tmpn/g;
        rnt = curhaveg * (g+b);
        if(curhaveg*g == tmpn)
        {
            rnt -= g+b;
            curhaveg -= 1;
        }
        rnt += tmpn-curhaveg*g;
        printf("%lld\n",max(n,rnt));
    }
    return 0;
}

C. Perfect Keyboard

我是负责图论和数据结构的所以咳咳...脑回路清奇,我们将每个字母看成一个节点,他们相邻就连边呗,啥情况输出 \(NO\) ?首先我们排除一下重边,然后就是如果有环肯定不行,自行证明一下吧,还有一个就是一个点的度大于等于 \(3\) 不行,这个也自己想一下为什么。

我用的是并查集判环,度直接开数组 \(in\) 判断。最后图构建好以后找一个度为 \(1\) 的点 \(dfs\) 一下,没加到答案里的字母最后加进去就行了。为什么找一个度为 \(1\) 的点开始 \(dfs\) 一遍就好?因为这个无向图一定是一棵树,而且只能从儿子开始遍历,还是自己想一下为什么。

杀鸡用了牛刀...勿喷

时间复杂度主要用在判重边了,所以整体时间复杂度 为 \(O(nlogn+nα(n))=O(nlogn)\) 。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define _for(i,a,b) for(int i = (a);i < b;i ++)
#define _rep(i,a,b) for(int i = (a);i > b;i --)
#define INF 0x3f3f3f3f
#define ZHUO 11100000007
#define MOD 1000000007
#define MIKUNUM 39
#define pb push_back
#define debug() printf("Miku Check OK!\n")
#define X first
#define Y second

#define maxn 39
#define maxe 2003
struct Djs
{
    int par[maxn];
    int high[maxn];
    void renew()
    {
        _for(i,1,maxn)
        {
            par[i] = i;
            high[i] = 0;
        }
    }
    int find(int x)
    {
        return par[x] == x ? x : par[x] = find(par[x]);
    }
    void unite(int x,int y)
    {
        x = find(x);
        y = find(y);
        if(x==y) return ;
        if(high[x]<high[y])
            par[x] = y;
        else
        {
            par[y] = x;
            if(high[x]==high[y])
                high[x] ++;
        }
    }
    bool same(int x,int y)
    {
        return find(x) == find(y);
    }
}djs;

struct G
{
    int n,m;
    int Next[maxe];
    int head[maxn];
    int ver[maxe];
    int tot;
    void add(int x,int y)
    {
        ver[++tot] = y,Next[tot] = head[x],head[x] = tot;
    }
    void renew()
    {
        tot = 0;
        n = 26;
        memset(head,0,sizeof(head));
    }
} g;

int to(char c)
{
    return c-'a'+1;
}

int vis[27];
int in[27];
string rnt;

void dfs(int x)
{
    rnt += x+'a'-1;
    vis[x] = 1;
    for(int i = g.head[x]; i; i = g.Next[i])
    {
        int y = g.ver[i];
        if(vis[y])
            continue;
        dfs(y);
    }
}

int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while(t--)
    {
        string s;
        cin >> s;
        memset(vis,0,sizeof(vis));
        memset(in,0,sizeof(in));
        rnt.clear();
        g.renew();
        djs.renew();

        set<pair<int,int>> st;
        int flag = 0;
        _for(i,0,s.size()-1)
        {
            if(st.count( {to(s[i]), to(s[i+1])} )
            || st.count( {to(s[i+1]), to(s[i])} ) )
                continue;
            if(djs.same( to(s[i]), to(s[i+1]) ) )
            {
                flag = 1;
                break;
            }
            g.add(to(s[i]), to(s[i+1])),g.add(to(s[i+1]), to(s[i]));
            st.insert({to(s[i]), to(s[i+1])});
            djs.unite(to(s[i]), to(s[i+1]));
            in[to(s[i])] ++,in[to(s[i+1])] ++;
            if(in[to(s[i])] >= 3
            || in[to(s[i+1])] >= 3)
            {
                flag = 1;
                break;
            }
        }

        if(flag)
        {
            printf("NO\n");
            continue;
        }

        int sta;
        _for(i,1,27)
            if(in[i]==1)
                sta = i;
        if(s.size()!=1)
            dfs(sta);
        _for(i,1,27)
            if(!vis[i])
                 rnt += i+'a'-1;
        printf("YES\n%s\n",rnt.c_str());
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Asurudo/p/12302930.html

时间: 2024-07-31 21:52:27

codeforces 1303 题解(更新中)的相关文章

codeforces 1296 题解(更新中)

codeforces 1296 题解 A. Array with Odd Sum 想要数组加和为奇数,可以从数组长度是奇数还是偶数着手 若数组长度为偶数,则数组全奇或全偶必定不能构造满足题目要求的数列 若数组长度为奇数,则数组全偶必定不能构造满足题目要求的数列 #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; #define _for(i,a,b) for(int i =

PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/problem-sets/994805046380707840/problems 目录 (点击对应题目即可进入相应题解--小声BB--) L1-001 Hello World (5 分) L1-002 打印沙漏 (20 分) L1-003 个位数统计 (15 分) L1-004 计算摄氏温度 (5

CodeForces 444C 节点更新求变化值的和

http://vjudge.net/problem/viewProblem.action?id=51622 题目大意: 给定一列n个数字,最初赋予值1到n 两个操作:1.将区间[l,r]内的数改为x,则这区间中所有数的改变值进行求和,即ans=abs(a[l]-x)+abs[a[l+1]-x).....abs(a[r]-x),但不要求输出 2.需要将刚才要求得到的区间改变值输出出来 这里我们利用一个color[]数组相当于给这堆数进行染色,当某个区间内的赋予的值相等时,我们可以看做有一个相同的c

codeforces Towers 题解

Little Vasya has received a young builder's kit. The kit consists of several wooden bars, the lengths of all of them are known. The bars can be put one on the top of the other if their lengths are the same. Vasya wants to construct the minimal number

linux学习资料持续更新中

一.LINUX基础教程 1.老男孩系列免费视频: 1) linux高薪入门实战视频教程(第二部)老男孩linux教程 http://edu.51cto.com/course/course_id-1035-page-1.html 2) 跟着老男孩从0开始一步步实战深入学习linux运维(三) http://edu.51cto.com/lesson/id-11909.html linux学习资料持续更新中,布布扣,bubuko.com

Hello World!的各种编程语言程序(持续更新中……)

对于很多学习编程语言新手们,可能接触到的第一个程序就是"Hello World"的输出程序,笔者想在此篇简短的博文中介绍关于各种编程语言的"Hello World"输出程序. 至今,笔者仅仅接触过C++和Python两种编程语言,而且都仅仅是新手,所以此次只能写C++和Python两种语言的"Hello World"输出程序,但此篇博文会随着笔者学习的编程语言种类的增多而不断完善. 1. C++语言 #include<iostream>

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

shell脚本练习题(更新中...)

练习题(这里贴的是自己写的代码, 网上给的题目代码我会附加在最下面) 1. 编写shell脚本,计算1-100的和: 1 #!/bin/bash 2 #caculate the sum of numbers from 1 to 100 3 4 sum=0 5 for i in `seq 1 100`; do 6 sum=$[$sum+$i] 7 done 8 echo $sum 2. 编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求,如果输入的数字小于1,则重新输入,直到

ArcGIS 网络分析[1] 介绍与博文目录【更新中】

网络分析是个热点,理论上是属于计算机图形学和数据结构的,GIS以此为基础做出应用. 以下列举本人在学习中遇到的网络分析问题与经验总结. 平台:Windows 10操作系统,ArcGIS for Desktop 10.2或更高版本 用到的软件和SDK:VisualStudio 2012或更高版本.ArcGIS Objects 10.2或更高版本.Microsoft.NET Framework 3.5或更高版本 [网络分析介绍] [博文目录] 1. ArcGIS 网络分析[2] 利用自定义基础数据创