【题目描述】

最近小 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)的更多相关文章

  1. 【csp模拟赛4】基站建设 (station.cpp)

    [题目描述] 小 Z 的爸爸是一位通信工程师,他所在的通信公司最近接到了一个新的通 信工程建设任务,他们需要在 C 城建设一批新的基站. C 城的城市规划做得非常好,整个城市被规整地划分为 8 行 8 ...

  2. 【csp模拟赛5】限制 (restrict.cpp)--数学

    自己看吧: 爆搜代码: //春水初涨-春林初盛-春风十里-不如你 //----hzwer // 这是啥子题,读不懂-- //题意有问题 -- #include<iostream> #inc ...

  3. 【csp模拟赛5】购物(shopping.cpp)--常规

    多项式,因为每次的x相同,所以把a和b相加就行了,然后找对称轴,找离对称轴最近的整数点,然而我却写了个暴力,没看x #include <iostream> #include <cst ...

  4. 【csp模拟赛4】旅行计划 (travelling.cpp)--欧拉回路

    [题目描述] 小 Z 打算趁着暑假,开启他的旅行计划.但与其他同学不同的是,小 Z 旅 行时并不关心到达了哪个网红景点打了哪些卡.小 Z 更关注沿路的风光,而且 小 Z 觉得,尽管多次到达同一个地方, ...

  5. 【csp模拟赛4】 珠江夜游 (cruise.cpp)-二分,贪心

    Problem 1 珠江夜游 (cruise.cpp) [题目描述] 小 Z 放假后难得来一趟广州游玩,当然要吃遍广州各路美食小吃然后再 到珠江新城看看远近闻名的小蛮腰啦!可当小 Z 一路吃吃吃以后, ...

  6. 【csp模拟赛1】铁路网络 (network.cpp)

    [题目描述] 在暑假来临之际,小 Z 的地理老师布置了一个暑假作业,让同学们暑假期间 了解一下 C 国的铁路发展史.小 Z 在多番查证资料后发现,C 国在铁路发展初期, 铁路网络有着一个严密规整的结构 ...

  7. CSP模拟赛游记

    时间:2019.10.5 考试时间:100分钟(连正式考试时间的一半还没有到)题目:由于某些原因不能公开. 由于第一次接触NOIinux系统所以连怎么建文件夹,调字体,如何编译都不知道,考试的前半小时 ...

  8. 【CSP模拟赛】Freda的迷宫(桥)

    题目描述 Freda是一个迷宫爱好者,她利用业余时间建造了许多迷宫.每个迷宫都是由若干房间和走廊构成的,每条走廊都连接着两个不同的房间,两个房间之间最多只有一条走廊直接相连,走廊都是双向通过.  黄昏 ...

  9. CSP模拟赛2游记

    这次由于有课迟到30min,了所以只考了70min. 调linux配置调了5min,只剩下65min了. T1:有点像标题统计,但要比他坑一点,而且我就被坑了,写了一个for(int i=1;i< ...

随机推荐

  1. C# 批量设置窗体中控件状态的方法

    在开发中常遇到当点击某个按钮的时候,禁用文本框或按钮的的状态,以防止误操作,下面的代码是我已批量设置指定控件中的按钮状态的代码,同理可以延伸出很多操作. /// <summary> /// ...

  2. 【opencv 源码剖析】 三、 morphOp 数学形态学滤波函数, 腐蚀和膨胀就是通过这个函数得到的

    // //_kernel : 形态学滤波的核 //anchor: 锚点再滤波核的位置 //iterations: 迭代次数 static void morphOp( int op, InputArra ...

  3. 关于Mybatis的几件小事(一)

    一.Mybatis简介 1.Mybatis简介 MyBatis是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集. M ...

  4. 封装AJAX库(参考JQ)

    //jQ方法 $.ajax([URL],[OPTIONS]) $.ajax({ url:'', data:null, datatype:'json', method:'GET', async:true ...

  5. for in和for of的区别

    for in:一般用于遍历普通对象(即没有部署Iterator接口),遍历的是属性. for of:ES6新增的遍历方式,能遍历大部分的类型,遍历的是值.for...of 允许你遍历 Arrays(数 ...

  6. vue项目中使用特殊字体

    项目开发中遇到要是有‘数字’字体的情况,样式如下 网上查了一下实现的方法很简单,而且具体的实现方式大致相同,可以参考以下几个链接: https://www.cnblogs.com/zhangnan35 ...

  7. Chrome开发者工具中Elements(元素)断点的用途

    SAP Engagement Center UI的这个按钮会每秒钟刷新一次,显示页面已经打开了多长时间. 需求:需要找到哪行JavaScript代码不断刷新的按钮文字. 按照经验判断,这个文字肯定是一 ...

  8. Spring Cloud(一)服务的注册与发现(Eureka)

    Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集 ...

  9. str 文本函数的调用

    方法 说明 S.isdigit() 判断字符串中的字符是否全为数字 S.isalpha() 判断字符串是否全为英文字母 S.islower() 判断字符串所有字符是否全为小写英文字母 S.isuppe ...

  10. 批量kill指定名称的进程

     以Airflow举例: ps -ef | grep “airflow" | grep -v grep | cut -c 9-15 | xargs kill -9   分析: ps -ef  ...