A

两种情况

  1. 两个字符相同只有2
  2. 两个字符不相同4
#include <bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define vi vector<int> using namespace std; void solve() {
string a,b;
cin>>a>>b;
if(a==b){
cout<<2<<endl;
cout<<a<<endl;
cout<<a<<a<<endl;
}else{
cout<<4<<endl;
cout<<a<<endl;
cout<<b<<endl;
cout<<a<<b<<endl;
cout<<b<<a<<endl;
}
} signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// freopen("1.in", "r", stdin);
int _;
// cin>>_;
// while(_--)
solve();
return 0;
}

B

答案只有两种情况0和1

如果已经不是排列答案是0

否则一定可以通过修改一个数变为非排列

#include <bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define vi vector<int> using namespace std; void solve() {
int n;
cin>>n;
set<int>s;
bool st=false;
rep(i,1,n){
int val;
cin>>val;
if(s.count(val)!=0||val>n||val<1){
st=true;
}
s.insert(val);
}
if(st){
cout<<0<<endl;
}else{
cout<<1<<endl;
cout<<1<<' '<<n+1<<endl;
}
} signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// freopen("1.in", "r", stdin);
int _;
// cin>>_;
// while(_--)
solve();
return 0;
}

C

从高位往低位贪心,如果是偶数,就分开。

最后需要注意一下用\(vector\)排序\(string\)如何按字典序排序

#include <bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define vi vector<int> using namespace std; bool cmp(string a, string b) {
if(a.size()!=b.size()) return a.size()<b.size();
return a+b < b+a; //按字典序从小到大排列
} void solve() {
string s;
cin>>s;
int n=s.size()-1;
vector<string>ans;
int cur=0;
rep(i,0,n){
int c=s[i]-'0';
// cout<<c<<endl;
string res;
if(c%2==0){
rep(j,cur,i){
res+=s[j];
}
ans.pb(res);
cur=i+1;
}
}
sort(ans.begin(),ans.end(),cmp);
for(auto it:ans){
cout<<it<<endl;
}
} signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// freopen("1.in", "r", stdin);
int _;
// cin>>_;
// while(_--)
solve();
return 0;
}

D

这道分类讨论刚开始写的很乱感觉有点不好写,确实不太好写

参考了qfl的代码感觉用队列写确实简洁了很多。

分类讨论

首先通过观察我们可以知道,如果有答案最后的答案,一定是前面一段全部是一样的,后面一段全部是一样的。

也就是\(aaaabbbb\)这种形式

我们可以通过把每一个0变为离他最近的非零数字,然后去check是否合法,来判断和构造解。

那种情况是可能合法的。

\(ans\):我们用\(ans\)来表示相邻项的差的绝对值

当\(ans>1\):一定不合法

当\(ans=1\):合法,且经过暴力修改得到的解就是构造方案

当\(ans=0\):需要去看\(a[1]\)或者\(a[n]\),是否能产生1的贡献。

为什么考虑\(1、n\)因为1个数出现在中间的话一定会产生2的贡献

如果\(a[1]\)或\(a[n]\)有一个在最开始为0则有解,如果同时都不为0则无解,

有解的话,在修改完的\(a[1]或a[n]\)上加1就是构造的解。

#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define vi vector<int> using namespace std;
const int maxn=1e5+10;
int n;
int a[maxn],vis[maxn]; void solve() {
cin>>n;
queue<int>q;
rep(i,1,n){
cin>>a[i];
if(a[i]){
q.push(i);
vis[i]=1;
}
}
//全部都是0构造2 1 1 1 1 ...
if(q.size()==0){
cout<<2<<' ';
rep(i,1,n-1){
cout<<1<<' ';
}
}
//否则找到每个0最近的相同的非零的数,把它变为那个数
while(q.size()){
auto t=q.front();
q.pop();
if(t>1&&a[t-1]==0){
a[t-1]=a[t];
q.push(t-1);
}
if(t<n&&a[t+1]==0){
a[t+1]=a[t];
q.push(t+1);
}
}
int ans=0;
rep(i,2,n){
ans+=abs(a[i]-a[i-1]);
} if(ans>1){
cout<<-1<<endl;
return;
}else if(ans==0){
//看第一个数和最后一个数最开始是否为0
if(vis[1]&&vis[n]){
cout<<-1<<endl;
// cout<<"AAAAAAA"<<endl;
return;
}
if(!vis[1]){
a[1]++;
}else{
a[n]++;
}
rep(i,1,n){
cout<<a[i]<<' ';
}
}else{
rep(i,1,n){
cout<<a[i]<<' ';
}
}
} signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
freopen("1.in", "r", stdin);
int _;
// cin>>_;
// while(_--)
solve();
return 0;
}

E

bfs直接去染色然后判断即可。


#include <bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define vi vector<int> using namespace std; void solve() {
int n;
cin>>n;
string s;
cin>>s;
vector<vi>g(n+1);
rep(i,1,n-1){
int u,v;
cin>>u>>v;
u--;
v--;
g[u].pb(v);
g[v].pb(u);
}
int cnt=0;
rep(i,0,n-1){
if(s[i]=='?'){
cnt++;
}
}
auto topsort=[&](){
queue<int>q;
rep(i,0,n-1){
if(s[i]!='?'){
q.push(i);
}
}
while(q.size()){
auto u=q.front();
q.pop();
for(auto v:g[u]){
if(s[v]=='?'){
if(s[u]=='d'){
s[v]='p';
}else{
s[v]='d';
}
q.push(v);
} }
}
};
auto check=[&](){
rep(i,0,n-1){
for(auto v:g[i]){
if(s[i]==s[v]){
return false;
}
}
}
return true;
};
if(cnt==n){
s[0]='p';
}
// cout<<cnt<<endl;
// exit(0);
topsort();
if(check()){
cout<<s<<endl;
}else{
cout<<-1<<endl;
}
} signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// freopen("1.in", "r", stdin);
int _;
// cin>>_;
// while(_--)
solve();
return 0;
}

牛客周赛34(A~E)的更多相关文章

  1. 牛客练习赛34 little w and Segment Coverage (差分区间)

    链接:https://ac.nowcoder.com/acm/contest/297/C来源:牛客网 题目描述 小w有m条线段,编号为1到m. 用这些线段覆盖数轴上的n个点,编号为1到n. 第i条线段 ...

  2. 牛客周赛11TG B-弹钢琴

    链接:https://ac.nowcoder.com/acm/contest/941/B来源:牛客网 题目描述 春希想听和纱弹钢琴! 为了阻止异变的发生,Pi将钢琴魔改了 钢琴上有 N 个键,每个键有 ...

  3. 牛客挑战赛34 A~E

    闷声发大财 A O(nmk)dp即可,因为带了1/2的常数+2s所以很稳 #include <algorithm> #include <iostream> #include & ...

  4. 牛客练习赛34 D little w and Exchange(归纳)

    题意: 给n个数,和m 问这组数是否可以构成[1, m]中的每一个数 思路: 先将a数组排序. 先算算构成前几个数需要什么,至少需要a[1]=1 需要a[2] = 1,2 在a[2] = 1的情况下a ...

  5. 牛客OI周赛9-提高组题目记录

    牛客OI周赛9-提高组题目记录 昨天晚上做了这一套比赛,觉得题目质量挺高,而且有一些非常有趣而且非常清奇的脑回路在里边,于是记录在此. T1: 扫雷 题目链接 设 \(f_i\) 表示扫到第 \(i\ ...

  6. 牛客OI周赛8-提高组A-用水填坑

    牛客OI周赛8-提高组A-用水填坑 题目 链接: https://ac.nowcoder.com/acm/contest/403/A 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制: ...

  7. 牛客OI周赛7-提高组 A 小睿睿的等式

    链接:https://ac.nowcoder.com/acm/contest/371/A来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如“A+B=n”的等式且使用的火柴棒数也恰好等于n ...

  8. 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)

    链接:https://ac.nowcoder.com/acm/contest/371/B来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知道 ...

  9. 牛客OI周赛7-普及组 解题报告

    出题人好评. 评测机差评. A 救救喵咪 二位偏序.如果数据范围大的话直接树状数组,不过才1000就\(O(n^2)\)暴力就ok了. #include <bits/stdc++.h> s ...

  10. 牛客OI周赛2-提高组

    A.游戏 链接:https://www.nowcoder.com/acm/contest/210/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...

随机推荐

  1. 深入浅出Java多线程(一):进程与线程

    引言 大家好,我是你们的老伙计秀才. 在计算机系统的发展历程中,早期的计算机操作模式十分单一和低效.用户只能逐条输入指令,而计算机则按照接收指令的顺序逐一执行,一旦用户停止输入或进行思考,计算机会处于 ...

  2. 4.基于Label studio的训练数据标注指南:情感分析任务观点词抽取、属性抽取

    情感分析任务Label Studio使用指南 1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取).文本分类等 2.基于Label studio的训练数据标注指南:(智能文档) ...

  3. vscode连不上云服务器,一直报超时错误|但是xshell那些又可以连上?为什么vscode连不上?|命令行输出管道报错 -bash: command not found 导致的一系列问题

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总https://blog.cs ...

  4. 关于OJ中的输入格式的问题

    输入:1 2 3 4 5 6 7 8 9 10 如上的输入,并未告诉我们终止条件,这种无上限输入的格式可以用以下格式读入 int main() { int S[100]; int i = 0; whi ...

  5. MySQL-面试知识点汇总

    1. DQL相关 2. DDL.DML.DCL相关 3.架构相关 3.1 MySQL的复制原理以及流程 主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将 ...

  6. vue-element-admin iframes 组件 保留 iframe 操作状态

    由于没有时间去维护这个功能,这个仓库我暂停了,当前博客内容和代码只作为实现思路参考 代码贴前面,gitee地址:https://gitee.com/chkhk/vue-element-admin 可以 ...

  7. 使用SpeechRecognition进行语音识别

    操作系统 : CentOS7.7.1908_x64 gcc版本 :4.8.5 Python 版本 : 3.6.8 安装语音识别环境: virtualenv -p /usr/bin/python3 py ...

  8. TCP和UDP面试题提问

    @ 目录 TCP UDP 总结 应用 TCP(传输控制协议)和UDP(用户数据报协议)是两种计算机网络通信协议,它们在网络通信中起着不同的作用. TCP TCP 是面向连接的协议,它在数据传输之前需要 ...

  9. NEMU PA 3-3 实验报告

    一.实验目的 在上一章PA3-2中,我们实现了分段机制,将48位的虚拟地址vaddr转换成了laddr.为什么不是paddr呢?这就要说到这一章要完成的东西:**分页机制 **. 从80386开始,计 ...

  10. Vdbench 使用说明

    一. vdbench简介 vdbench是一个 I/O 工作负载生成器,用于验证数据完整性和度量直接附加和网络连接的存储的性能.它是一个免费的工具,容易使用,而且常常用于测试和基准测试. 可以使用vd ...