[NOIP2016]愤怒的小鸟(状压DP)

[NOIP2016]愤怒的小鸟(状压DP)

题目描述

输入输出格式

输入格式:

第一行包含一个正整数 T,表示游戏的关卡总数。

下面依次输入这 T个关卡的信息。每个关卡第一行包含两个非负整数 n,m,分别表示该关卡中的小猪数量和 Kiana 输入的神秘指令类型。接下来的 n行中,第 ii 行包含两个正实数xi,yi​,表示第 i只小猪坐标为xi,yi。数据保证同一个关卡中不存在两只坐标完全相同的小猪。

如果 m=0,表示Kiana输入了一个没有任何作用的指令。

如果 m=1,则这个关卡将会满足:至多用 \left \lceil n/3+1 \right \rceil只小鸟即可消灭所有小猪。

如果 m=2,则这个关卡将会满足:一定存在一种最优解,其中有一只小鸟消灭了至少\left \lfloor n/3 \right \rfloor只小猪。

保证1\leq n\leq 18,0\leq m\leq 2,0<xi,yi<10

输出格式:

对每个关卡依次输出一行答案。

输出的每一行包含一个正整数,表示相应的关卡中,消灭所有小猪最少需要的小鸟数量。

输入输出样例

输入样例#1: 

2
2 0
1.00 3.00
3.00 3.00
5 2
1.00 5.00
2.00 8.00
3.00 9.00
4.00 8.00
5.00 5.00

输出样例#1: 

1
1

输入样例#2: 

3
2 0
1.41 2.00
1.73 3.00
3 0
1.11 1.41
2.34 1.79
2.98 1.49
5 0
2.72 2.72
2.72 3.14
3.14 2.72
3.14 3.14
5.00 5.00

输出样例#2:

2
2
3

输入样例#3: 复制

1
10 0
7.16 6.28
2.02 0.38
8.33 7.78
7.68 2.09
7.46 7.86
5.77 7.44
8.24 6.72
4.42 5.11
5.42 7.79
8.15 4.99

输出样例#3: 

6

说明

【样例解释1】

这组数据中一共有两个关卡。

第一个关卡与【问题描述】中的情形相同,22只小猪分别位于(1.00,3.00)(1.00,3.00)和 (3.00,3.00)(3.00,3.00),只需发射一只飞行轨迹为y = -x^2 + 4xy=−x2+4x的小鸟即可消灭它们。

第二个关卡中有55只小猪,但经过观察我们可以发现它们的坐标都在抛物线 y = -x^2 + 6xy=−x2+6x上,故Kiana只需要发射一只小鸟即可消灭所有小猪。

【数据范围】

 

Solution

(我们知道三点确定一个抛物线,此处的n<=18)

枚举两头猪,设坐标为(x1,y1),(x2,y2),以(0,0),(x1,y1),(x2,y2)作抛物线,求出抛物线上有哪些猪,记为:g[i,j]

于是f[i|g[j][k]]=min(f[i|g[j][k]],f[i]+1) 

这显然是一个O(2^{n}n^{2})的做法,似乎不太优秀。

事实上,这个DP有可优化之处:每一次枚举的抛物线必须包含未消灭的第一头猪!

Because枚举的抛物线的顺序与最优解无关,并且未消灭的猪在之后的抛物线中必须被覆盖到至少一次,那么与其先覆盖其他的猪,不如直接先覆盖第一头未消灭的猪,这对答案是没有影响的。因此,每一次转移只需要枚举能覆盖第一头未消灭的猪的抛物线即可。

改变了转移之后,时间复杂度变为O(2^{n}n),轻松AC。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-6;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=1e9+7;
const int MAXN=20;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/inline int read() 
{int w=0; bool q=1; char c=getchar();while ((c<'0'||c>'9')&&c!='-') c=getchar();if (c=='-') q=0,c=getchar();while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar();return q?w:-w;
}int g[MAXN][MAXN],s[MAXN],f[(1<<MAXN)+5];
double x[MAXN],y[MAXN];
inline bool check(double x,double y){ return abs(x-y)<eps; }
int main(){s[0]=1; for (int i=1;i<=19;i++) s[i]=s[i-1]<<1;int Case=read();while (Case--){int n=read(),m=read();for (int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);memset(g,0,sizeof(g));memset(f,INF,sizeof(f)); f[0]=0;for (int i=1;i<=n;i++)for (int j=i+1;j<=n;j++) {if (check(x[i],x[j])) continue; double a=(y[j]/x[j]-y[i]/x[i])/(x[j]-x[i]);if (a>=0)             continue; double b=y[i]/x[i]-a*x[i];for (int k=1;k<=n;k++) g[i][j]+=s[k-1]*(check(a*x[k]+b,y[k]/x[k]));}for (int i=0;i<=s[n]-1;i++)for (int j=1;j<=n;j++)if (!(i&s[j-1])){for (int k=j+1;k<=n;k++) upmin(f[i|g[j][k]],f[i]+1);upmin(f[i|s[j-1]],f[i]+1);}printf("%d\n",f[s[n]-1]);}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给 asp.net core 写一个简单的健康检查

给 asp.net core 写一个简单的健康检查Intro健康检查可以帮助我们知道应用的当前状态是不是处于良好状态&#xff0c;现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供了健康检查机制来检测应用的健康状态&#xff0c;如果应用本身就提供一个健康检查的机制…

从阿里中台战略看企业IT架构转型之道(下)

此文是我阅读《企业IT架构转型之道》一书的学习笔记的下半部分&#xff0c;所有内容出自钟华老师的这本书。上半部分Part1~Part5请点击这里Part 6 异步与缓存原则异步化事务 > 核心是ACID柔性事务 > 基础是CAP理论和BASE理论&#xff0c;因为互联网应用最核心的需求是高可…

CF1543C. Need for Pink Slips

CF1543C. Need for Pink Slips 题意&#xff1a; 题解&#xff1a; 其实具体的计算方法在说明里面都写了&#xff1a;对于第一个数据&#xff1a; 0.2 0.2 0.6 0.2组成方案如下&#xff1a; 就是c和m如果大于v就减&#xff0c;小于v就变成0&#xff0c;到p直接停止 所以直接…

并查集(并茶几)

并查集&#xff08;并茶几&#xff09;的应用 一、What‘s that&#xff1f; 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合&#xff08;Disjoint Sets&#xff09;的合并及查询问题。常常在使用中以森林来表示。 ——百度百科 二、How to uphold 0.我们的需…

从阿里中台战略看企业IT架构转型之道(上)

此文是我阅读《企业IT架构转型之道》一书的学习笔记的上半部分&#xff0c;所有内容出自钟华老师的这本书。零、为何阅读《企业IT架构转型之道》在加入X公司后&#xff0c;开始了微服务架构的实践&#xff0c;也开始了共享平台服务的建设&#xff0c;在这方面阿里巴巴的中台战略…

ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

通过上文所介绍的内容&#xff0c;我们已经完成了RESTful API的开发&#xff0c;现在&#xff0c;就可以使用Azure DevOps来进行持续集成&#xff08;CI&#xff09;和k8s持续部署&#xff08;CD&#xff09;了。本文我会对使用Azure DevOps进行CI/CD的过程中需要注意的地方进行…

P3195 [HNOI2008]玩具装箱

P3195 [HNOI2008]玩具装箱 题意&#xff1a; n件玩具&#xff0c;第i件玩具经过压缩后的一维长度为CiC_iCi​,现在把玩具装入一维容器中&#xff0c;要求&#xff1a; 在一个一维容器中的玩具编号是连续的如果一个一维容器中有多个玩具&#xff0c;那么两件玩具之间要加入一…

卷积与莫比乌斯反演

卷积与莫比乌斯反演 目录 卷积与莫比乌斯反演 0前言 0.1前置技能 0.2问题的引入 1.简单定义 1.1数论函数的定义 1.2卷积的定义 1.3反演的基本形式 2.1莫比乌斯反演 3.1例题&#xff1a;【luogu-P2257 YY的GCD】 题目大意&#xff1a; solution1 solution2 0.前言 莫比…

ML.NET机器学习、API容器化与Azure DevOps实践(三):RESTful API

通过上文所述案例&#xff0c;我们已经选择了最优回归算法来预测学生的综合成绩&#xff0c;并且完成了基于训练数据集的预测模型训练。从实现上&#xff0c;训练好的模型被保存成一个ZIP文件&#xff0c;以便在其它项目中直接调用以完成机器学习的实践场景。在本文中&#xff…

杜教筛

杜教筛 1.概述 杜教筛是用以解决积性函数前缀和的算法。 在学习了莫比乌斯反演之后&#xff0c;杜教筛的过程就会显得简单而自然。 2.基本形式 对于积性函数&#xff0c;我们定义如下函数&#xff1a; 构造积性函数 &#xff0c;使得 显然 &#xff1a; 进一步转化&#xf…

ML.NET机器学习、API容器化与Azure DevOps实践(二):案例

在上文中&#xff0c;我简单地介绍了机器学习以及ML.NET的相关知识&#xff0c;从本讲开始&#xff0c;我会基于一个简单的案例&#xff1a;学生成绩预测&#xff0c;来介绍使用ML.NET进行机器学习以及API部署的基本过程。本案例的数据来源为加州大学尔湾分校的机器学习公开样本…

业界萌新对斯坦纳树的小结

业界萌新对斯坦纳树的小结 0.简介 斯坦纳树问题是组合优化问题&#xff0c;与最小生成树相似&#xff0c;是最短网络的一种。最小生成树是在给定的点集和边中寻求最短网络使所有点连通。而最小斯坦纳树允许在给定点外增加额外的点&#xff0c;使生成的最短网络开销最小。 ——…

cf1208E. Let Them Slide

cf1208E. Let Them Slide 题意&#xff1a; 都放在一个长度为W的框里面。有n个序到&#xff0c;第i个序列的长度是1。这些序到并排放在一起&#xff0c;每一个序列都放在一个长度为w的框里 这些序列可以在框里面滑动&#xff0c;但是不能划出框。 对于每一个位置&#xff0…

结合eShopOnWeb全面认识领域模型架构

一.项目分析在上篇中介绍了什么是"干净架构"&#xff0c;DDD符合了这种干净架构的特点&#xff0c;重点描述了DDD架构遵循的依赖倒置原则&#xff0c;使软件达到了低藕合。eShopOnWeb项目是学习DDD领域模型架构的一个很好案例&#xff0c;本篇继续分析该项目各层的职…

SOS_dp算法

Codeforces博客 简介&#xff1a; 前置知识&#xff1a;状压dp Sum over Subsets dynamic programming&#xff0c;简称Sos dp,状压dp的一种 用一个列题引出SOS dp&#xff1a; 给你一个由2N2^N2N个整数组成的确定数组A&#xff0c;我们需要计算对于任意的x&#xff0c;F(x)所…

微软开源Bing搜索背后的关键算法

微软今天宣布开源了一项 Bing 搜索背后的关键算法 —— SPTAG&#xff0c;它使 Bing 能够快速将搜索结果返回给用户。仅在几年前&#xff0c;网络搜索很简单&#xff0c;用户输入几个关键词然后浏览结果页面。现如今&#xff0c;这些用户可能会在手机上拍照并将其放入搜索框中&…

Stern-Brocot Tree

Stern-Brocot Tree 0.简介 Stern-Brocot Tree&#xff0c;俗称SB树&#xff08;滑稽&#xff09;。它能够表示出所有的最简分数&#xff0c;如下图。 1.一些规律 显然&#xff0c;对于两个相邻的最简分数 可以得到另一个最简分数 这样就可以在Stern-Brocot Tree上表示出所有…

FWT(快速沃尔什变换)

文章目录引入&#xff1a;or卷积and卷积xor卷积IFWT模板&#xff1a;例题&#xff1a;引入&#xff1a; FFT/NTT是用来解决∑ijkA[i]B[j]\sum_{ijk}A[i]B[j]∑ijk​A[i]B[j]的式子 而FWT是用来解决Ci∑j⊕kiAjBkC_i\sum_{j⊕ki}A_jB_kCi​∑j⊕ki​Aj​Bk​ ​ FWT是一种用于处…

教你自制.NET Core Global Tools

点击上方蓝字关注“汪宇杰博客”命令行是程序员装逼利器&#xff0c;.NET Core也可以写命令行程序&#xff0c;但是如何分发给其他程序员使用&#xff0c;一直是个问题。现在&#xff0c;有了.NET Core Global Tools&#xff0c;可以很方便的解决分发问题&#xff0c;我们来看看…

三点间LCA

三点间LCA 1.直接上题——jzoj5883. 【NOIP2018模拟A组9.25】到不了 Dscription wy 和 wjk 是好朋友。 今天他们在一起聊天&#xff0c;突然聊到了以前一起唱过的《到不了》。 “说到到不了&#xff0c;我给你讲一个故事吧。” “嗯&#xff1f;” “从前&#xff0c;神和凡人…