Codeforces Round #585 (Div. 2) [补题]
前言
2019.9.16
昨天下午就看了看D题,没有写对,因为要补作业,快点下机了,这周争取把题补完。
2019.9.17
这篇文章或者其他文章难免有错别字不被察觉,请读者还是要根据意思来读,不要纠结qwq。
2019.9.18
\(n<=2*10^5\) 是 \(O(n)\) 或 \(O(nlogn)\) 的算法,知道这招以后就不会乱想方法了。
A Yellow Cards
洛谷CF1215A
开始我还没有想到什么好办法,太丢人了。
Sooke大佬给出了一个这样的方法:
对于\(Min\),我们假设先给每个人发\((k-1)\)张牌,\(a_1\)就是\((k_1-1)\),\(a_2\)就是\((k_2-1)\),使每个人达到一种“饱和状态”,剩下每一张黄牌都会使一个人下场。
对于\(Max\),我们采用暴力枚举\(i\),在\(a_1\)放\(i\)张,在\(a_2\)放\((n-i)\)张,找最大值就好了
Code
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
inline int read() {
	int x=0,f=1; char ch=getchar();
	while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
	return x * f;
}
int n,a1,a2,k1,k2,Max,Min;
int main()
{
	a1 = read(), a2 = read(), k1 = read(), k2 = read(), n = read();
	Min = max(0, n-((k1-1)*a1+(k2-1)*a2));
	for(int i=0;i<=n;++i) {
		Max = max(Max, min(a1 ,i/k1)+min(a2, (n-i)/k2));
	}
	printf("%d %d\n",Min,Max);
	return 0;
}
B The Number of Products
洛谷CF1215B
想到用动态规划
设 \(f[i][j][0/1]\) 为\(i\),\(j\)区间,0表乘积为正数,1表乘积为负数 的子区间数。这个方程十分好推。一想题目没有这么简单,这个方程时间空间复杂度都太大,可能过不了,所以放弃这种状态。
诶,发现刚才想多了!(同时发现刚才那个方程并不好推,因为子区间是连续的一段)
下面给出我思考许久的正解:
设 \(f[i][0/1]\) 表示以i结尾 0表乘积为正数,1表乘积为负数 的子区间数,那么我们可以推出方程
如果 i 是+,则 \(f[i][0]=f[i-1][0]+1\)(加上自己),\(f[i][1]=f[i-1][1]\)
如果 i 是-,则 \(f[i][0]=f[i-1][1]\),\(f[i][1]=f[i-1][0]+1\)
最后统计答案:
\]
总结一下:有区间不能盲目的区间DP,根据题意往往是连续性的采用线性DP。主要还是要看自己的脑子灵不灵活啊!哎~qwq
Code
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
inline int read() {
	int x=0,f=1; char ch=getchar();
	while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
	return x * f;
}
const int N = 2e5+7;
int n,a,l,r;
int f[N][2];
signed main()
{
	n = read();
	for(int i=1;i<=n;++i) {
		a = read();
		if(a > 0) f[i][0] = f[i-1][0]+1, f[i][1] = f[i-1][1];
		else f[i][0] = f[i-1][1], f[i][1] = f[i-1][0]+1;
		l += f[i][0], r += f[i][1];
	}
	printf("%lld %lld\n",r,l);
	return 0;
}
D Swap Letters
洛谷CF1215C
题解歇礼拜再补吧
Code
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+7;
int n,num1,num2;
int P1[N],P2[N];
char s[N],t[N];
int main()
{
	scanf("%d %s %s",&n,s+1,t+1);
	int na = 0, nb = 0;
	for(int i=1;i<=n;++i) {
		if(s[i]=='a') ++na; else ++nb;
		if(t[i]=='a') ++na; else ++nb;
	}
	if((na&1) || (nb&1)) {
		puts("-1"); return 0;
	}
	for(int i=1;i<=n;++i) {
		if(s[i]=='a' && t[i]=='b') P1[++num1] = i;
		if(s[i]=='b' && t[i]=='a') P2[++num2] = i;
	}
	if(num1&1) {
		printf("%d\n",(num1+num2)/2 + 1);
		for(int i=1;i<=num1-1;i+=2) printf("%d %d\n",P1[i], P1[i+1]);
		for(int i=1;i<=num2-1;i+=2) printf("%d %d\n",P2[i], P2[i+1]);
		printf("%d %d\n%d %d\n",P1[num1], P1[num1], P1[num1], P2[num2]);
	} else {
		printf("%d\n",(num1+num2)/2);
		for(int i=1;i<=num1;i+=2) printf("%d %d\n",P1[i], P1[i+1]);
		for(int i=1;i<=num2;i+=2) printf("%d %d\n",P2[i], P2[i+1]);
	}
	return 0;
}
D Ticket Game
洛谷CF1215D
万万没想到是博弈论,搞得我比赛时还在一边死磕DP
因为从来没有学过博弈论啊,所以完全没有往这边想。不过看完题解后还是能理解的。
先设 \(ln,ls\)是分别左边的问号数 and 数字和,\(rn,rs\)同理。A是先手,B是后手。B的任务是要 票快乐,A反之。
先考虑 \(ls==rs\) 的情况:
若\(ls==rs\) 且 \(ln==rn\) 时,B必赢。自己推一下就知道了,不论A在哪个空填几,B只要在相反方向填上相同数即可。
若\(ls==rs\) 且 \(ln!=rn\) 时,A必赢。一边填完后,会有另一边没有填完,但是这时(填完一边后)会有\(ls==rs\),所以A随便填几都可以破坏局势。
再考虑 \(ls!=rs\) 的情况,先使 \(ls > rs\),那么:
若 \(ls > rs\) 且 \(ln==rn\) 时,A必赢。想一下就知道了。
若 \(ls > rs\) 且 \(ln > rn\) 时,A必赢。同理。
若 \(ls > rs\) 且 \(ln<rn\) 时,填完左边后,右边相比左边小了\(rs-ls\),这时设右边空位还有\(n\)个,那么必须要\((n/2)*9==rs-ls\) 时 B才能赢,否则就是A赢。想一想就明白了。
Code
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+7;
int n,ln,rn,ls,rs;
char s[N];
int main()
{
	scanf("%d %s",&n,s+1);
	for(int i=1;i<=n/2;++i) {
		if(s[i] == '?') ++ln;
		else ls += s[i]^48;
	}
	for(int i=n/2+1;i<=n;++i) {
		if(s[i] == '?') ++rn;
		else rs += s[i]^48;
	}
	if(ls < rs) swap(ls, rs), swap(ln, rn);
	if(ls != rs) {
		if(ln > rn) puts("Monocarp");
		else {
			int sum = ls - rs, num = rn - ln;
			if((num/2)*9 == sum) puts("Bicarp");
			else puts("Monocarp");
		}
	} else {
		if(ln == rn) puts("Bicarp");
		else puts("Monocarp");
	}
	return 0;
}
												
											Codeforces Round #585 (Div. 2) [补题]的更多相关文章
- Codeforces Round #412  Div. 2 补题 D. Dynamic Problem Scoring
		
D. Dynamic Problem Scoring time limit per test 2 seconds memory limit per test 256 megabytes input s ...
 - Codeforces Round #786 (Div. 3) 补题记录
		
小结: A,B,F 切,C 没写 1ll 对照样例才发现,E,G 对照样例过,D 对照样例+看了其他人代码(主要急于看后面的题,能调出来的但偷懒了. CF1674A Number Transforma ...
 - Codeforces Round #429 (Div. 2) 补题
		
A. Generous Kefa 题意:n个气球分给k个人,问每个人能否拿到的气球都不一样 解法:显然当某种气球的个数大于K的话,就GG了. #include <bits/stdc++.h> ...
 - Codeforces Round #419 (Div. 1) 补题  CF 815 A-E
		
A-C传送门 D Karen and Cards 技巧性很强的一道二分优化题 题意很简单 给定n个三元组,和三个维度的上限,问存在多少三元组,使得对于给定的n个三元组中的每一个,必有两个维度严格小于. ...
 - Codeforces Round #590 (Div. 3)补题
		
要想上2000分,先刷几百道2000+的题再说 ---某神 题目 E F 赛时是否尝试 × × tag math bitmask 难度 2000 2400 状态 ∅ √ 解 E 待定 F 传送门 第一 ...
 - Codeforces Round #574 (Div. 2)补题
		
A. Drinks Choosing 统计每种酒有多少人偏爱他们. ki 为每种酒的偏爱人数. 输出ans = (n + 1)/2 > Σki / 2 ? (n + 1)/2 - Σki / ...
 - Codeforces Round #615 (Div. 3) 补题记录
		
第一次搞CF,结果惨不忍睹...还是太菜了 A:要用到全部的钱,所以总数必须是3的倍数,而且初始状态下任意一人的钱数不能超过总数除以3,否则没法分了 (也就这个签到算是在我能力范围之内了....) # ...
 - Codeforces Round #617 (Div. 3) 补题记录
		
1296A - Array with Odd Sum 题意:可以改变数组中的一个数的值成另外一个数组中的数,问能不能使数组的和是个奇数 思路:签到,如果本来数组的和就是个奇数,那就OK 如果不是,就需 ...
 - Codeforces Round #378 (Div. 2) D题(data structure)解题报告
		
题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...
 
随机推荐
- Mysql中主键与索引
			
摘自: https://www.cnblogs.com/wicub/p/5898286.html 一.什么是索引?索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没 ...
 - UltraISO(软碟通) 制作U盘启动盘
			
在使用之前我们先下载好UltraISO并安装完成. 打开软碟通,执行文件-->打开命令,找到下载好的ubuntu系统镜像文件 选择写入映象的U盘(U盘容量一定要大于镜像文件的容量),执行启动-- ...
 - elementUI下拉树组件封装
			
使用组件:Popover 弹出框.Tree 树形控件 和 input 输入框 用法: 1.新建一个.vue文件,粘贴以下组件封装的代码(完全可以使用) 2.在页面需要使用下拉树的地方调用即可. (1) ...
 - GTID复制模式切换与传统主从复制间切换
			
GTID复制模式切换到传统主从复制主从复制环境:主库:10.18.10.11从库:10.18.10.12MySQL5.7.22 切换之前查看下主从gitd_mode参数值主服务器:gtid_mode值 ...
 - http://bbs.csdn.net/topics/340046630   dbgrid怎么获取当前记录值
			
这根grid无关,当你选中一条记录时,数据集就定位到这条数据上了,你只需要读取数据集中的数据就行了 对我有用[0] 丢个板砖[0] 引用 | 举报| 管理 hongss hongss 本版等级: ...
 - 《Using Databases with Python》Week1 Object Oriented Python 课堂笔记
			
Coursera课程<Using Databases with Python> 密歇根大学 Charles Severance Week1 Object Oriented Python U ...
 - Spring学习02——控制反转、依赖注入
			
有两个人,张三和李四 package com.su.service; public class ZhangSan implements Tester{ public void test(){ Syst ...
 - KETTLE——(一)资源库
			
对KETTLE有了大概的了解,pdi-ce-6.0.1.0-386也下载完成了. 1.解压pdi-ce-6.0.1.0-386.zip文件,双击运行Spoon.bat(KETTLE是Java开发的,运 ...
 - 重拾SQL——表中索值
			
2016.10.23 + 2016.11.02 1.选择所有数据(查看整表) MariaDB [tianyuan]> select * from pet; +----------+------- ...
 - 【Unity】给物品添加力
			
给物体添加力 两个方法: Rigidbody.AddForce(Vector3,ForceMode):给刚体添加一个力,让刚体按世界坐标系进行运动 Rigidbody.AddRelativeForce ...