• 考虑对电灯进行差分:若第i个电灯和第i + 1个电灯状态不同,则在第i个位置上放一个球

    这样我们就放置了不超过2n个球,且必然是偶数个

    于是问题转化为:有m个球,每一步可以把一个球平移奇质数个位置,两个球位于相同位置则同时被消除,计算至

    少多少步能消除所有球
  • 然后我们发现, 假如两个东西距离为奇质数cost为1, 偶数cost为二(哥德巴赫猜想), 其余奇数的话cost为3
  • 然后发现一种贪心方法, 是尽量匹配cost为1的, 然后分奇偶性各自用2覆盖,看看最后剩下的那个直接判断即可
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#define ll long long
#define mmp make_pair
#define M
using namespace std;
int read() {
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
}
struct Edge{
int v, c, nxt;
}e[200010];
int head[10010], tot = 1;
void build(int u, int v, int c)
{
e[++tot] = (Edge){v, c, head[u]};
head[u] = tot;
return ;
}
void insert(int u, int v, int c)
{
build(u, v, c);
build(v, u, 0);
return ;
}
int dep[10010];
int S, T;
queue<int> q;
bool bfs()
{
memset(dep, 0, sizeof(dep));
dep[S] = 1;
q.push(S);
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = head[u]; i; i = e[i].nxt)
if(!dep[e[i].v]&&e[i].c)
{
dep[e[i].v] = dep[u] + 1;
q.push(e[i].v);
}
}
if(dep[T])return true;
return false;
}
int cur[10010];
int dfs(int u, int flow)
{
if(u == T)return flow;
for(int &i = cur[u]; i; i = e[i].nxt)
if(e[i].c&&dep[e[i].v] == dep[u] + 1)
{
int d = dfs(e[i].v, min(e[i].c, flow));
if(d){
e[i].c -= d;
e[i^1].c += d;
return d;
}
}
return 0;
}
int dinic()
{
int ans = 0;
while(bfs())
{
for(int i = S; i <= T; i++)
cur[i] = head[i];
int d;
while(d = dfs(S, 1e9))ans += d;
}
return ans;
}
int prime[1000010], cnt;
bool vis[10000010];
int x[1010];
int posx[1010], posy[1010];
int cnt1, cnt2;
void push(int x)
{
if(x&1)posx[++cnt1] = x;
else posy[++cnt2] = x;
}
int main(){
int N = 10000000;
vis[1] = true;
for(int i = 2; i <= N; i++)
{
if(!vis[i])prime[++cnt] = i;
for(int j = 1; j <= cnt&&i * prime[j] <= N; j++)
{
vis[i * prime[j]] = true;
if(i%prime[j] == 0)break;
}
}
vis[2] = true;
int t = read();
while(t--)
{
memset(head, 0, sizeof(head));
cnt1 = cnt2 = 0; tot = 1;
int n = read();
for(int i = 1; i <= n; i++)
{
x[i] = read();
if(i == 1||x[i - 1] != x[i] - 1)push(x[i]);
if(i> 1&&x[i - 1] != x[i] - 1)push(x[i - 1] + 1);
}
push(x[n] + 1);
S = 0, T = cnt1 + cnt2 + 1;
for(int i = 1; i <= cnt1; i++)
insert(S, i, 1);
for(int i = 1; i <= cnt1; i++)
for(int j = 1; j <= cnt2; j++)
if(!vis[max(posx[i] - posy[j], posy[j] - posx[i])])
insert(i, cnt1 + j, 1);
for(int i = 1; i <= cnt2; i++)
insert(cnt1 + i, T, 1);
int ans = dinic();
printf("%d\n", ans + (cnt1 - ans)/2 * 2 + (cnt2 - ans)/2 * 2 + (cnt1 - ans)%2 * 3);
}
return 0;
}

Problem B: 故障电灯(light)的更多相关文章

  1. Light OJ 1272 Maximum Subset Sum 高斯消元 最大XOR值

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011686226/article/details/32337735 题目来源:problem=12 ...

  2. 设计模式(15)-Facade Pattern

    http://www.cnblogs.com/zhenyulu/articles/55992.html 一. 门面(Facade)模式 外部与一个子系统的通信必须通过一个统一的门面(Facade)对象 ...

  3. 门面(Facade)模式(转)

    转载:http://www.cnblogs.com/skywang/articles/1375447.html 外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式. ...

  4. java并发 使用ScheduledExecutor的温室控制器--thinking in java 21.7.5

    package org.rui.thread.newc; import java.text.DateFormat; import java.text.SimpleDateFormat; import ...

  5. hdoj Pipe&&南阳oj管道问题&&poj1039(计算几何问题...枚举)

    Pipe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. js原生之一个面向对象的应用

    function IElectricalEquipment() { }        IElectricalEquipment.prototype = {            poweron: fu ...

  7. 自学Zabbix3.8.2-可视化Visualisation-maps网络地图

    自学Zabbix3.8.2-可视化Visualisation-maps网络地图 可以简单的理解为动态网络拓扑图,可以针对业务来配置zabbix map,通过map可以了解应用的整体状况:服务器是否异常 ...

  8. 011.Zabbix的拓扑创建

    一 Map简介 Map的作用是将各种设备用网络拓扑图的方式展示,在Zabbix中,拓扑的展示通过手动方式添加. 二 Map的添加 2.1 添加Map的背景图 #在添加Map之前可谓Map添加一个背景图 ...

  9. (58)zabbix网络拓扑图配置network map

    zabbix网络地图介绍 “zabbix network map”可以简单的理解为动态网络拓扑图,可以针对业务来配置zabbix map, 通过map可以了解应用的整体状况:服务器是否异常.网络是否有 ...

随机推荐

  1. 学习flask需要用到的包

    Flask 需要下载的包 1.pip install flask 2.pip install flask-script 3.pip install flask-sqlalchemy 4.pip ins ...

  2. Java基于opencv实现图像数字识别(二)—基本流程

    Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ...

  3. curl请求

    <?php $cookie_file = tempnam('./temp','cookie');  //创建cookie文件保存的位置/** * [curl description] * @pa ...

  4. Linux系统安装IonCube的方法详解教程

    ioncube是业内优秀的php加密解密解决方案.和zend guard相比,ioncube具有如下优势: 1. 安全:zend guard的版本不是非常安全,网络上有破解使用zend,下面我们来看I ...

  5. 经典问题----最小生成树(prim普里姆贪心算法)

    题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...

  6. Java_02变量、数据类型和运算符

    1.变量命名规则 变量必须以字母.下划线 " _ " 或 " $ " ( " ¥ " ) 符号开头. 变量可以包括数字,但不能以数字开头. ...

  7. PythonStudy——nonlocal关键字

    # 作用:将局部的变量提升为嵌套局部变量# 1.必须有同名嵌套局部变量,就是统一嵌套局部与局部的同名变量# -- 如果局部想改变嵌套局部变量的值(发生地址的变化),可以用nonlocal声明该变量 d ...

  8. Networked Graphics: Building Networked Games and Virtual Environments (Anthony Steed / Manuel Fradinho Oliveira 著)

    PART I GROUNDWORK CHAPTER 1 Introduction CHAPTER 2 One on One (101) CHAPTER 3 Overview of the Intern ...

  9. py-day4-2 python 内置函数

    zip() #zip 拉链方法 一一对应 只要是序列类型的都可以 print(list(zip(('a','b','c'),(1,2,3)))) 结果: [('a', 1), ('b', 2), (' ...

  10. Python 模块源

    1.官方:https://pypi.org/ 2.LFD UCI :https://www.lfd.uci.edu/~gohlke/pythonlibs/ 4.清华源:https://pypi.tun ...