第二次打虚拟赛。

CF 传送门

T1:Yellow Cards

黄色卡片

中规中矩的 \(T1\)。

首先可以算出一个人也不罚下时发出的最多黄牌数: \(sum=a1*(k1-1)+a2*(k2-1)\)

此时,若 \(sum>=n\),则最少罚下 \(0\) 人,否则最少罚下 \(n-sum\) 人。

然后看最多。优先考虑全部发给所需黄牌数少就能下场的一队。如果全下光了,就去发给另一队。

不得不说这比赛机制简直找打

Code:

#include<bits/stdc++.h>
using namespace std;
int a1,a2,k1,k2,n,sum,tmp;
int main(){
scanf("%d%d%d%d%d",&a1,&a2,&k1,&k2,&n);
sum=a1*(k1-1)+a2*(k2-1);
printf("%d ",max(0,n-sum));
if(k1>k2){
swap(k1,k2);
swap(a1,a2);
}
tmp=n/k1;
if(tmp>a1){
n-=a1*k1;
printf("%d",a1+n/k2);
}
else printf("%d",tmp);
return 0;
}

\(5min\) 速切

T2:The Number of Products

一开始想的是用前缀和算每个区间的负数个数,但是 \(O(n^2)\) 显然超时。于是就顿住了 \(qwq\)。

后来想到可以对每一次读入快速判。设置一个标记记录当前正负状态。如果标记为正,那么正答案加上之前所有的正区间、负答案加上之前所有负区间(不变号)。如果标记为负,那么正答案加上之前所有的负区间、负答案加上之前所有正区间(变号)。

然鹅样例都过不了,一度怀疑做法假了。就去看了眼 \(T3\)。后来发现,没有算单独一个数的。最后正答案再加上正数个数、负答案再加上负数个数就好了。时间复杂度 \(O(n)\)。

Code:

#include<bits/stdc++.h>
using namespace std;
long long n,a,z,f,ans1,ans2,fl=1;
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a);
if(a<0) fl=-fl;
if(fl>0) ans1+=z,ans2+=f,z++;
else ans1+=f,ans2+=z,f++;
}
printf("%lld %lld",ans2+f,ans1+z);
return 0;
}

\(33min\) 才过 \(qwq\)

T3:Swap Letters

一开始读错题,以为是单个字符串内部交换。心想怎么会这么水。对着样例才发现了错误。

首先容易得知,两个字符串中 \(b\)(或 \(a\)) 的个数为偶数时,一定有解。为奇数则一定无解。

其次考虑怎么交换。对照样例三:

in:

8
babbaabb
abababaa

out:

3
2 6
1 3
7 8

发现,每一对交换的字符有共同点

  • 要不是串一都为 \(a\),串二都为 \(b\) 的一对

  • 要不是串一都为 \(b\),串二都为 \(a\) 的一对

简单思考后发现这样成对交换就是最优的。(换一次就可以匹配上两位)

于是,考虑先统计出 串一为 \(a\),串二为 \(b\) 的位数 \(cnt1\),并存入 \(ans1\) 数组。同时统计出 串一为 \(b\),串二为 \(a\) 的位数 \(cnt2\),并存入 \(ans2\) 数组。

这时发现一个问题,\(cnt1\) 和 \(cnt2\) 不一定为偶数,有可能不能各自成对匹配完。但可以发现, \(cnt1\) 与 \(cnt2\) 必同奇偶。由于偶数成对匹配更优,所以只可能剩下 一位串一为 \(a\),串二为 \(b\)一位串一为 \(b\),串二为 \(a\)

这时就出现了样例一的情况:

in:

4
abab
aabb

out:

2
3 3
3 2

只要按着样例一的方式特判输出即可。

Code:

#include<bits/stdc++.h>
using namespace std;
int n,ans1[200005],ans2[200005],cnt,cnt1,cnt2;
string s1,s2;
int main(){
scanf("%d",&n);
cin>>s1>>s2;
for(int i=0;i<n;i++){
if(s1[i]=='b') cnt++;
if(s2[i]=='b') cnt++;
}
if(cnt%2==1) printf("-1");
else{
for(int i=0;i<n;i++){
if(s1[i]=='a'&&s2[i]=='b') ans1[++cnt1]=i+1;
if(s2[i]=='a'&&s1[i]=='b') ans2[++cnt2]=i+1;
}
if(cnt1%2==0){
printf("%d\n",cnt1/2+cnt2/2);
for(int i=1;i<=cnt1;i+=2){
printf("%d %d\n",ans1[i],ans1[i+1]);
}
for(int i=1;i<=cnt2;i+=2){
printf("%d %d\n",ans2[i],ans2[i+1]);
}
}
else{
printf("%d\n",cnt1/2+cnt2/2+2);
for(int i=1;i<=cnt1-1;i+=2){
printf("%d %d\n",ans1[i],ans1[i+1]);
}
for(int i=1;i<=cnt2-1;i+=2){
printf("%d %d\n",ans2[i],ans2[i+1]);
}
printf("%d %d\n",ans1[cnt1],ans1[cnt1]);
printf("%d %d\n",ans1[cnt1],ans2[cnt2]);
}
}
return 0;
}

\(49min\) AC \(qwq\)

T4:Ticket Game

看上去是高大上的博弈论问题,实际就是贪心。

考虑把字符串分成左右两部分,分别统计出两边的 ? 个数 \(l,r\) 与不是 ? 的数字之和 \(ls,rs\)。

因为 Monocarp 先手,而 Bicarp 要维护字符串两边和相等,所以在两边都还有 ? 时,Monocarp 填任意一个, Bicarp 必然在另一边填一个相等的数字。所以,这些过程对结果是无意义的,可以把两边都有的 ?个数抹掉。

于是,问题就变成了一边都是数,在另一边填数。由题意,问号为偶数个,所以原来两边问号奇偶相同,减掉后剩下的问号也为偶数个。

这时我们发现,问题很像小学奥数里的取棋子游戏。就是每人每次取一个或两个,取到最后一个者胜,判断先后手谁胜。易知,棋子总数为 \(3\) 的倍数时,后手必胜,因为只要补 \(3\) 即可。

假设剩下的 ? 都在右边,问题就变成两人轮流填 \(0-9\) 的数,若最后和为 \(ls-rs\) 则后手胜。所以易想到 “补 \(9\)” 的策略。因为问号只有 \(r-l\) 个,所以每人只能填 \(\frac{r-l}{2}\) 次。

得出结论:只要 \(ls-rs\) 是 \(9\) 的 \(\frac{r-l}{2}\) 倍,则 Bicarp 胜。反之则 Monocarp 胜。

因为赛时很快想到思路,代码实现也简单,所以成为拉分的一题。

Code:

#include<bits/stdc++.h>
using namespace std;
int n,ls,rs,l,r;
string s;
int main(){
scanf("%d",&n);
cin>>s;
for(int i=0;i<n/2;i++){
if(s[i]=='?') l++;
else ls+=s[i]-'0';
}
for(int i=n/2;i<n;i++){
if(s[i]=='?') r++;
else rs+=s[i]-'0';
}
if(l>r){
swap(l,r);
swap(ls,rs);
}
r-=l;
if(r/2*9+rs==ls) printf("Bicarp");
else printf("Monocarp");
return 0;
}

\(1h\) \(05min\) AC \(qwq\)

T5:Marbles

状压 \(DP\),告辞

一个结论:把一个序列变为不降所需要的相邻元素交换次数就是这个序列的逆序对数。

那么这题要我们干的是什么呢?就是按颜色变为不降,只不过颜色的大小顺序我们可以任意指定而已。比如样例 \(1\) 指定的就是 \(3<4<2\),样例 \(2\) 指定的就是 \(20<1<14<10<2\)。

看到颜色数最多 \(20\),显然是状压 \(DP\)。定义 \(f[s]\) 是 \(s\) 对应的颜色的大小顺序已经安排好了的最小逆序对数。

假设已经安排好 \(k1<k2<⋯<km\) ,我们选择一个在 \(s\) 中没出现过的 \(k_{m+1}\)。那么新的状态就要加上 \((k_1,k_{m+1})\)之间的,满足 \(i<j,a_i=k_1,a_j=k_2\) 的 \((i,j)\)对数。这个预处理一下就好了。

——来自 \(\color{orange}{x义x}\) 巨佬的 题解

Code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[400005],cnt[25];
ll b[25][25],f[2000005];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
for(int j=1;j<=20;j++) b[j][a[i]]+=cnt[j];
cnt[a[i]]++;
}
memset(f,0x3f,sizeof(f));
f[0]=0;
for(int k=0;k<(1<<20);k++){
for(int i=1;i<=20;i++){
if((k>>(i-1))&1) continue ;
ll tmp=0;
for(int j=1;j<=20;j++){
if((k>>(j-1))&1) tmp+=b[j][i];
}
f[k|(1<<(i-1))]=min(f[k|(1<<(i-1))],f[k]+tmp);
}
}
printf("%lld\n",f[(1<<20)-1]);
return 0;
}

T6:Radio Stations

施工中 \(qwq\)

【Virt.Contest】CF1215(div.2)的更多相关文章

  1. 【Virt.Contest】CF1321(div.2)

    第一次打虚拟赛. CF 传送门 T1:Contest for Robots 统计 \(r[i]=1\) 且 \(b[i]=0\) 的位数 \(t1\) 和 \(r[i]=0\) 且 \(b[i]=1\ ...

  2. 【Virt.Contest】CF1155(div.2)

    CF 传送门 T1:Reverse a Substring 只有本身单调不减的字符串不能转换为字典序更小的字符串.否则肯定会出现 \(s_i>s_{i+1}\) 的情况. 所以只要从头到尾扫一遍 ...

  3. 【小瑕疵】在div里插入img后在底部留有缝隙怎么解决

    [本文转载自http://blog.sina.com.cn/s/blog_9fd5b6df01013mld.html] 图片IMG与容器下边界之间有空隙怎么办?这里介绍3中简单的解决方法. 第一,给图 ...

  4. 【Codeforces Round】 #432 (Div. 2) 题解

    Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017)  A. Arpa and a research in Mexi ...

  5. 【Codeforces Round】 #431 (Div. 2) 题解

    Codeforces Round #431 (Div. 2)  A. Odds and Ends time limit per test 1 second memory limit per test ...

  6. 【CSS基础】实现 div 里的内容垂直水平居中

    方案一: 所有内容垂直水平居中 兼容性:IE8+. 条件:内容宽度和高度可以未知,可以是多行文字.图片.div. 描述:使用table-cell + vertical-align , html代码见文 ...

  7. 【java web】--css+div总结

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  8. 【网摘】监控 div 的内容变化

    数据是动态加载而来,而当无数据时,提示一下暂无数据.而数据是可以动态在当前页面即时添加的,故在无数据时所做提示,需要隐藏,所以找了这个方法.成功在动态添加数据后,暂无数据的提示没有了. if($(&q ...

  9. 两种隐藏元素方式【display: none】和【visibility: hidden】的区别

    此随笔的灵感来源于上周的一个面试,在谈到隐藏元素的时候,面试官突然问我[display: none]和[visibility: hidden]的区别,我当时一愣,这俩有区别吗,好像有,但是忘记了啊,因 ...

随机推荐

  1. FFT快速傅立叶变换:解析wav波频图、Time Domain、Frequency Domain

    您好,此教程将教大家使用scipy.fft分析wav文件的波频图.Time Domain.Frequency Domain. 实际案例:声音降噪,去除高频. 结果: 波频图: Time Domain:

  2. 【Java】学习路径48-线程锁ReentrantLock

    与上一章学习的线程锁synchronized类似,都是为了解决线程安全的问题. 使用方法: 新建一个ReentrantLock对象.(如果使用Thread多线程,则需要声明static静态) 然后在需 ...

  3. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(16)-Fiddler如何充当第三者,再识AutoResponder标签-上篇

    1.简介 Fiddler充当第三者,主要是通过AutoResponder标签在客户端和服务端之间,Fiddler抓包,然后改包,最后发送.AutoResponder这个功能可以算的上是Fiddler最 ...

  4. python进阶__用socket封装TCP

    想要理解socket协议,点击链接,出门左转 一.TCP 通信的服务器端编程的基本步骤: 服务器端先创建一个 socket 对象. 服务器端 socket 将自己绑定到指定 IP 地址和端口. 服务器 ...

  5. JDBC连接池&JDBCTemplate

    今日内容 1. 数据库连接池 2. Spring JDBC : JDBC Template 数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容 ...

  6. centos7换清华源

    一 删除其他源 cd /etc/yum.repos.d/ 二 创建源 vim CentOS-Base.repo # CentOS-Base.repo # # The mirror system use ...

  7. [Python]-os模块-文件读取

    import os 在Python中,os模块用来处理文件路径,比较方便. os读取文件 在读取文件过程中,最常用的几个功能如下: os.listdir() 获取此目录下的所有目录名,并且存为列表.在 ...

  8. Elasticsearch基础但非常有用的功能之一:别名

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484454&idx=1&sn=43e95a2 ...

  9. CentOS使用yum方式安装yarn和nodejs

    # 使用epel-release.repo源安装的nodejs版本是6.17.1,有些前端项目使用的话会提示版本太低,具体下图 # 命令执行后的详细情况:curl -sL https://rpm.no ...

  10. 创建Grafana Dashboard

    输入表达式,获取数据 但是考虑到多台主机,需要添加变量来选择不同主机,从而出现相应的图表 点击右上角齿轮一样的图标,这个是设置 通过在prometheus界面查询可知,可以设置的变量有两个 考虑到这俩 ...