P3718 [AHOI2017初中组]alter
贪心+二分答案
二分最终答案长度
主要问题在check上
~~我代码写得巨丑,大家还是不要看我的代码了~~
------------
1:当mid大于1的时候,贪心策略是这样的:
当前连续的长度大于mid时,我不反转最后一个,我也不管它具体反转哪一个,我直接跳过这mid+1个,也就是开始处理i+1。举个例子,
mid=3,k=1,NNNNNNN,我反转第4个,变成NNNFNNN
mid=3,k=1,NNNNFFF,我反转前3个的任意一个
不管怎么反转,前4个对后面是没有影响了,那我就不用管具体怎么反转的
2:当mid等于1的时候,贪心策略是这样的:
跑两遍check,反转第一个,或者不反转第一个,两种情况有一个能行就ok
------------
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
#define inf 2147483647
#define N 1000010
#define p(a) putchar(a)
#define For(i,a,b) for(int i=a;i<=b;++i)
//by war
//2019.8.13
using namespace std;
int n,k,l,r,mid,a[N],cnt,now;
char c[N];
void in(int &x){
int y=;char c=getchar();x=;
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c<=''&&c>=''){ x=(x<<)+(x<<)+c-'';c=getchar();}
x*=y;
}
void o(int x){
if(x<){p('-');x=-x;}
if(x>)o(x/);
p(x%+'');
} bool check1(int x,int t){
int lf=k-;
For(i,,n)
if(c[i]=='N')
a[i]=;
else
a[i]=;
cnt=;now=t;
For(i,,n){
if(a[i]==now){
++cnt;
if(cnt>x){
a[i]^=;
if(x!=){
now=a[i+];
cnt=;
}
else{
now=a[i];
cnt=;
}
if(--lf<)
return ;
}
}
else{
now=a[i];
cnt=;
}
}
return ;
} bool check(int x){
int lf=k;
For(i,,n)
if(c[i]=='N')
a[i]=;
else
a[i]=;
cnt=;now=a[];
For(i,,n){
if(a[i]==now){
++cnt;
if(cnt>x){
a[i]^=;
if(x!=){
now=a[i+];
cnt=;
}
else{
now=a[i];
cnt=;
}
if(--lf<){
if(x==){
if(check1(x,a[]^))
return ;
return ;
}
return ;
}
}
}
else{
now=a[i];
cnt=;
}
}
return ;
} signed main(){
in(n);in(k);
cin>>(c+);
l=;r=n;
while(l<r){
mid=(l+r)>>;
if(check(mid))
r=mid;
else
l=mid+;
}
o(l);
return ;
}
P3718 [AHOI2017初中组]alter的更多相关文章
- P3719 [AHOI2017初中组]rexp
P3719 [AHOI2017初中组]rexp一开始想的是类似计算式子的值的东西,用栈.然后发现处理最大值很麻烦,因为处理的很像子过程,所以考虑递归来做.碰到'('就递归一次,碰到'|'就取最大值再递 ...
- P3719 [AHOI2017初中组]rexp——递归模拟
P3719 [AHOI2017初中组]rexp 没有什么算法的题做起来真不适应,这道题深深讽刺了我想用栈维护匹配括号个数的想法: 递归解决就行了: 时刻注意函数返回值是什么,边界条件是什么: #inc ...
- 洛谷P3719 [AHOI2017初中组]rexp
洛谷P3719 [AHOI2017初中组]rexp 题目背景 以下为不影响题意的简化版题目. 题目描述 给出一个由(,),|,a组成的序列,求化简后有多少个a. 化简规则: 1.形如aa...a|aa ...
- luogu3720 [AHOI2017初中组]guide[最短路]
初中组..唉 题意有点误解,当前在x点走一步,gps产生代价条件是沿非x到n的最短路走. 直接倒着跑两遍$i\sim n$的两种最短路,然后枚举每条边走的时候是否可以在两种最短路上,不是就产生1个代价 ...
- 题解 P3717 【[AHOI2017初中组]cover】
题目链接 本题的大致思路就是搜索. 将矩阵初始化成false.先把灯塔标记.在搜一遍灯塔能照到的点并标记.最后搜一遍找被灯塔标记的个数. 详细解释见题解. 题解走起. #include<bits ...
- P3717 [AHOI2017初中组]cover
题目背景 以下为不影响题意的简化版题目. 题目描述 一个n*n的网格图上有m个探测器,每个探测器有个探测半径r,问这n*n个点中有多少个点能被探测到. 输入输出格式 输入格式: 第一行3个整数n,m, ...
- 洛谷 3106 [USACO14OPEN]GPS的决斗Dueling GPS's 3720 [AHOI2017初中组]guide
[题解] 这两道题是完全一样的. 思路其实很简单,对于两种边权分别建反向图跑dijkstra. 如果某条边在某一种边权的图中不是最短路上的边,就把它的cnt加上1.(这样每条边的cnt是0或1或2,代 ...
- [AHOI2017初中组]guide
题目描述 农场主John最近在网上买了一辆新车,在购买汽车配件时,John不小心点了两次"提交"按钮.导致汽车上安装了两套GPS系统,更糟糕的是John在使用GPS导航时,两套系统 ...
- [AHOI2017初中组]guide 题解
题面 我们无论怎么走,都是要从此点沿最短路径走到终点,所以我们以n为原点跑两边dijkstra就可以了: 而抱怨数可以根据之前跑出来的东西新建一个图,然后跑最短路就好了: #include <b ...
随机推荐
- iOS开发inputView和inputAccessoryView
1.简介 起初看到这两个属性是在UIResponder中,只是可读的: @property (nullable, nonatomic, readonly, strong) __kindof UIVie ...
- [kuangbin带你飞]专题一 简单搜索 - M - 非常可乐
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...
- 《DSP using MATLAB》Problem 8.46
下雨了,大风降温,一地树叶,终于进入冬季了 代码: %% ----------------------------------------------------------------------- ...
- 关于a[::-1]
b = a[i:j] 表示复制a[i]到a[j-1],以生成新的list对象,a[:]就相当于完整复制一份a b = a[i:j:s]表示:i,j与上面的一样,但s表示步进,缺省为1.即从i到j每 ...
- 使用neo4j图数据库的import工具导入数据 -方法和注意事项
背景 最近我在尝试存储知识图谱的过程中,接触到了Neo4j图数据库,这里我摘取了一段Neo4j的简介: Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌 ...
- CSIC_716_20191031【计算机的组成】
引言 什么是编程语言 语言是人与人之间的沟通介质之一,编程语言是人与机器(包括计算机)之间沟通的介质. 一个完整的计算机系统主要包括 应用程序 .操作系统 和硬件 等. 计算机三大核心 ...
- Java迷宫代码,深度优先遍历
此次迷宫深度优先遍历寻找路径采用栈结构,每个节点都有固定的行走方向(右下左上),除非一个方向走不通,不然会一条道走到黑. 如果路径存在,打印出行走路径,否则打印出迷宫不存在有效路径. 方向常量定义: ...
- 【JZOJ5433】图
description 有一个n个点A+B条边的无向连通图,有一变量x,每条边的权值都是一个关于x的简单多项式,其中有A条边的权值是k+x,另外B条边的权值是k-x,如果只保留权值形如k+x的边,那么 ...
- 使用ajax怎么请求跨域资源
1.ajax中添加“xhrFields”和“crossDomain”,如: $.ajax({ url: url, data: data, type: "post", xhrFiel ...
- VS 解决方案 Xamarin 配置
需要额外安装 Mono 程序 工具->Xamarin->Android -> SDK路径 要和 你配置的ANDROID_SDK_ROOT 的路径一至如果没有 ANDROID_SDK ...