【csp模拟赛1】不服来战 (challenge.cpp)
【题目描述】
最近小 Z 和他的朋友都迷上了一款手机游戏:不服来战。 游戏的设定十分简单,在游戏开始时,会给出一排共 N 个灯,有的灯是开着 的有的是关着的,每个灯都有一个分数。而玩家可以进行任意次操作,每次操作 改变连续 K 盏灯的开关状态。尽管机智如小 Z 也总是没法得到最高分,没法把他 的朋友 PK 下来。于是他来向你请教,希望知道在不同情况下,最高分分别是多 少。
【输入格式】
第一行,一个正整数 T,表示测试数据组数。 对于每组测试数据: 首先是一行两个正整数 N,K,意义如题目所述。 接着是 N 个数依次表示 1~N 每盏灯的开关状态。每个数是 0 或 1,分别 表示 这盏灯初始时是关的或开的。 最后是 N 个非负整数依次表示 1~N 每盏灯亮着的得分。
【输出格式】
对每组测试数据输出一行。表示最大的得分。
【样例输入】
3 3 2 0 1 1 3 2 4 10
1 0 0 1 0 1 0 0 1 0 1
1 1 1 3 4 3 4 5 1 5 10 7
1 1 1 1 1 1 1 1 1 1
5 5 3 3 4
3 5 1 1 3
【样例输出】
7
28
33
【样例解释】
第一组数据:翻转前 2 盏灯是最优方案; 第二组数据:你可以把所有的灯点亮; 第三组数据:不做任何操作是最优方案
思路:
不从图的角度思考也可以得出正解。
考虑操作 i 和操作 i+1 同时按下,这时产生的 效果时把第 i 盏灯和第 i+K 盏灯翻转。
也就是说,我们得到了一种新的操作,这种操作是, 把任意相距为 K 的两盏灯同时翻转。
不难发现,以下两种操作可以等价于原题中的操作 “翻转任意连续 K 盏灯的状态”:
(1)同时翻转 1~K 盏灯
(2)同时翻转任意距离为 K 的两盏灯 等价性是因为,操作(2)可以由原题中的操作得来;而原题中“翻转任意连续 K 盏 灯的状态”可以通过一次(1)和若干次(2)组合而来。
下面我们只考虑新的操作(1)(2)。
首先,操作(1)是否进行可以枚举。这时,我 们只需考虑操作(2)。而操作(2)似乎把一列灯也分成了许多组。以 N=10, K=3 为例,
灯 1,4,7,10 是一组;
灯 2,5,8 是一组;
灯 3,6,9 是一组。
每次进行操作(2),等价于翻转一组内相邻的两盏灯! 组与组之间没有影响! 再稍作分析,不难发现,如果一组内“初始时是关的”的灯为偶数个,那么我们可以 做到只把它们全部打开,也就是说打开了这一组所有的灯;如果一组内“初始时是关的” 的灯为奇数个,这个时候我们不能把所有的灯都打开,只好作出让步,选择放弃亮度最小 的那盏灯。每一组都如此处理,最后加起来。
解法一、二的时间复杂度都是 O(N)的。
代码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
const int MAXN = 1000000;
using namespace std;
int T,n,k,val[MAXN],vis[MAXN],sum;
inline int read()
{
int x = 0,f = 1; char s = getchar();
while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();}
return x * f;
}
void clean()
{
memset(val,0,sizeof(val));
memset(vis,0,sizeof(vis));
sum=0;
}
int get1()
{
int ans1=sum;
for(int i=1;i<=k;i++)
{
int tot=0,mi=2147483647;
for(int j=i;j<=n;j+=k)
{
if(vis[j]==0)tot++;
mi=min(mi,val[j]);
}
if(tot & 1)ans1-=mi;
}
// cout<<ans1<<endl;
return ans1;
}
int get2()
{
int ans2=sum;
for(int i=1;i<=k;i++)vis[i]^=1;
for(int i=1;i<=k;i++)
{
int tot=0,mi=2147483647;
for(int j=i;j<=n;j+=k)
{
if(vis[j]==0)tot++;
mi=min(mi,val[j]);
}
if(tot & 1)ans2-=mi;
}
// cout<<ans2<<endl;
return ans2;
}
void work()
{
n=read();k=read();
for(int i=1;i<=n;i++) vis[i]=read();
for(int i=1;i<=n;i++) val[i]=read(), sum+=val[i];
int s1=get1();
int s2=get2();
int ans=max(s1,s2);
printf("%d\n",ans);
}
int main()
{
#ifdef yilnr
#else
freopen("challenge.in","r",stdin);
freopen("challenge.out","w",stdout);
#endif
T=read();
while(T--)clean(),work();
fclose(stdin);fclose(stdout);
return 0;
}
完毕:
一lin
【csp模拟赛1】不服来战 (challenge.cpp)的更多相关文章
- 【csp模拟赛4】基站建设 (station.cpp)
[题目描述] 小 Z 的爸爸是一位通信工程师,他所在的通信公司最近接到了一个新的通 信工程建设任务,他们需要在 C 城建设一批新的基站. C 城的城市规划做得非常好,整个城市被规整地划分为 8 行 8 ...
- 【csp模拟赛5】限制 (restrict.cpp)--数学
自己看吧: 爆搜代码: //春水初涨-春林初盛-春风十里-不如你 //----hzwer // 这是啥子题,读不懂-- //题意有问题 -- #include<iostream> #inc ...
- 【csp模拟赛5】购物(shopping.cpp)--常规
多项式,因为每次的x相同,所以把a和b相加就行了,然后找对称轴,找离对称轴最近的整数点,然而我却写了个暴力,没看x #include <iostream> #include <cst ...
- 【csp模拟赛4】旅行计划 (travelling.cpp)--欧拉回路
[题目描述] 小 Z 打算趁着暑假,开启他的旅行计划.但与其他同学不同的是,小 Z 旅 行时并不关心到达了哪个网红景点打了哪些卡.小 Z 更关注沿路的风光,而且 小 Z 觉得,尽管多次到达同一个地方, ...
- 【csp模拟赛4】 珠江夜游 (cruise.cpp)-二分,贪心
Problem 1 珠江夜游 (cruise.cpp) [题目描述] 小 Z 放假后难得来一趟广州游玩,当然要吃遍广州各路美食小吃然后再 到珠江新城看看远近闻名的小蛮腰啦!可当小 Z 一路吃吃吃以后, ...
- 【csp模拟赛1】铁路网络 (network.cpp)
[题目描述] 在暑假来临之际,小 Z 的地理老师布置了一个暑假作业,让同学们暑假期间 了解一下 C 国的铁路发展史.小 Z 在多番查证资料后发现,C 国在铁路发展初期, 铁路网络有着一个严密规整的结构 ...
- CSP模拟赛游记
时间:2019.10.5 考试时间:100分钟(连正式考试时间的一半还没有到)题目:由于某些原因不能公开. 由于第一次接触NOIinux系统所以连怎么建文件夹,调字体,如何编译都不知道,考试的前半小时 ...
- 【CSP模拟赛】Freda的迷宫(桥)
题目描述 Freda是一个迷宫爱好者,她利用业余时间建造了许多迷宫.每个迷宫都是由若干房间和走廊构成的,每条走廊都连接着两个不同的房间,两个房间之间最多只有一条走廊直接相连,走廊都是双向通过. 黄昏 ...
- CSP模拟赛2游记
这次由于有课迟到30min,了所以只考了70min. 调linux配置调了5min,只剩下65min了. T1:有点像标题统计,但要比他坑一点,而且我就被坑了,写了一个for(int i=1;i< ...
随机推荐
- 最大流Dinic(模板)
#define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupp ...
- 【转载】Jmeter接口测试+压力测试
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要 ...
- k8s之调度器、预选策略及优选函数
1.调度器(scheduler) 调度器的功能是调度Pod在哪个Node上运行,这些调度信息存储在master上的etcd里面,能够和etcd打交道的只有apiserver; kubelet运行在no ...
- react的状态管理
近两年前端技术的发展如火如荼,大量的前端项目都在使用或转向 Vue 和 React 的阵营, 由前端渲染页面的单页应用占比也越来越高,这就代表前端工作的复杂度也在直线上升,前端页面上展示的信息越来越多 ...
- 基于MFC对话框的2048游戏
在之前一篇<简单数字拼板游戏学习>基础上修改,地址:http://www.cnblogs.com/fwst/p/3706483.html 开发环境:Windows 7/ Visual St ...
- 感兴趣的WebGL ,来自微博的一个全景星空图~
https://m.weibo.cn/z/panorama?oid=1042143:ee51daffe7e7f497069af8c74840bbc2 还有一些好玩的相关链接 http://webgls ...
- CSP-S2019题解
格雷码 €€£:我不抄自己辣!JOJO! 这题比那个SCOI的炒鸡格雷码好多了,甚至告诉你构造方法,所以... void wk(uLL kk) { int j=0; for(uLL i=n-1;~i; ...
- SpringBoot与缓存、消息、检索、任务、安全与监控
一.Spring抽象缓存 Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口 ...
- Linux I2C核心、总线和设备驱动
目录 更新记录 一.Linux I2C 体系结构 1.1 Linux I2C 体系结构的组成部分 1.2 内核源码文件 1.3 重要的数据结构 二.Linux I2C 核心 2.1 流程 2.2 主要 ...
- 安卓开发之sql语句增删改查
package com.lidaochen.phonecall; import android.content.Context; import android.database.sqlite.SQLi ...