第二次打虚拟赛。

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. Python之创建数据库及功能示例样本

    创建数据库实例 import pymysql db= pymysql.connect(host="localhost",user="root",password ...

  2. Makefile 文件的编写

    目录 目录 Makefile 编写规则 Makefile 编写规则 生成的目标文件:依赖文件 生成目标文件所需执行的动作(注:命令行前需加Tab推进) 例: VPATH=inc src main:ma ...

  3. Android平台Camera2数据如何对接RTMP推流到服务器

    1. Camera2架构 在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2), 之前使用 ...

  4. KingabseES 锁机制

    KingabseES的锁机制 目录 KingabseES的锁机制 一.前言 二.锁机制 三.表级锁 ( Table-Level Locks ) 1.访问共享(ACCESS SHARE) 2.行共享(R ...

  5. 基于 iframe 的微前端框架 —— 擎天

    vivo 互联网前端团队- Jiang Zuohan 一.背景 VAPD是一款专为团队协作办公场景设计的项目管理工具,实践敏捷开发与持续交付,以「项目」为核心,融合需求.任务.缺陷等应用,使用敏捷迭代 ...

  6. Java 自定义Excel数据排序

    通常,我们可以在Excel中对指定列数据执行升序或者降序排序,排序时可依据单元格中的数值.单元格颜色.字体颜色或图标等.在需要自定义排序情况下,我们也可以自行根据排序需要编辑数据排列顺序.本文,将通过 ...

  7. selenium爬取图片

    一.https/http开头的图片 1.我们以百度为例,下载百度图片到本地. 2.定位到该元素的img标签 from selenium import webdriver from selenium.w ...

  8. thinkphp5.1中适配百度富文本编辑器ueditor

    百度富文本编辑器ueditor虽然很老,但是功能齐全,我近期需要能批量粘贴图片的功能,但是找不到,很无奈.然后现在就分享一下如何把ueditor适配到thinkphp5.1,有知道如何批量上传图片的艾 ...

  9. dotnet 为大型应用接入 ApplicationStartupManager 启动流程框架

    对于大型的应用软件,特别是客户端应用软件,应用启动过程中,需要执行大量的逻辑,包括各个模块的初始化和注册等等逻辑.大型应用软件的启动过程都是非常复杂的,而客户端应用软件是对应用的启动性能有所要求的,不 ...

  10. filebeat读取超链接日志 symlinks

    filebeat读取超链接日志文件,还需要增加配置上额外的参数:symlinks: true 符号链接选项允许Filebeat除常规文件外,可以收集符号链接.收集符号链接时,即使报告了符号链接的路径, ...