首页 > 其他分享 >P2831 [NOIP2016 提高组] 愤怒的小鸟

P2831 [NOIP2016 提高组] 愤怒的小鸟

时间:2024-08-04 23:27:46浏览次数:8  
标签:NOIP2016 frac 1x db P2831 小鸟 x2 dp define

思路:

考虑先求出经过 \((x_1,y_1),(x_2,y_2)\) 的抛物线解析式

我们有:

\[\begin{cases} ax_1^2 + bx_1 = y_1 \\ ax_2^2 + bx_2 = y_2\end{cases} \]

考虑将 \(b\) 消掉,求出 \(a\)。

那么考虑令 \(1\) 式减去 \(2\) 式的 \(\frac{x_1}{x_2}\) 倍:

\[ax_1^2 + bx_1 - ax_1x_2 - bx_1 = y_1 - \frac{x_1}{x_2} y_2 \]

\[a(x_1^2 -x_1x_2) = y_1 - \frac{x_1}{x_2} y_2 \]

\[a = \frac{y_1 - \frac{x_1}{x_2} y_2}{x_1^2 -x_1x_2} = \frac{y_1x_2 - x_1 y_2}{x_1^2x_2 - x_1x_2^2} \]

因为 \(a\) 太复杂度,不好带入,考虑也将 \(a\) 消掉,求出 \(b\)。

那么考虑令 \(1\) 式减去 \(2\) 式的 \(\frac{x_1^2}{x_2^2}\) 倍:

\[ax_1^2 + bx_1 - ax_1^2 - b\frac{x_1^2}{x_2} = y_1 - y_2 \frac{x_1^2}{x_2^2} \]

\[b(x_1 - \frac{x_1^2}{x_2}) = y_1 - y_2 \frac{x_1^2}{x_2^2} \]

\[b = \frac{y_1 - y_2 \frac{x_1^2}{x_2^2}}{x_1 - \frac{x_1^2}{x_2}} = \frac{y_1x_2^2 - y_2 x_1^2}{x_1x_2^2 - x_1^2 x_2} \]

那么我们可以得到经过 \((x_1,y_1),(x_2,y_2)\) 的抛物线解析式为:

\[y = \frac{y_1x_2 - x_1 y_2}{x_1^2x_2 - x_1x_2^2} x^2 + \frac{y_1x_2^2 - y_2 x_1^2}{x_1x_2^2 - x_1^2 x_2} x \]

可以通过这个解析式求出其它在这个抛物线上的点,设 \(A_{i,j}\) 表示经过点 \(i\) 和点 \(j\) 的抛物线经过的所有点的点集。

考虑状态压缩 dp,令 \(dp_S\) 表示 \(S\) 这个点集的鸟被射下来的最小次数,则:

\[dp_0 = 0 \]

\[dp_{S \operatorname{or} A_{i,j}} = \min(dp_{S \operatorname{or} A_{i,j}},dp_S + 1) \]

\[dp_{S \operatorname{or} 2^{i-1}} = \min(dp_{S \operatorname{or} 2^{i-1}},dp_S+1) \]

时间复杂度为 \(O(Tn^22^n)\)。

完整代码:

#include<bits/stdc++.h>
#define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y)
#define lowbit(x) x&(-x)
#define pi pair<ll,ll>
#define pii pair<ll,pair<ll,ll>>
#define iip pair<pair<ll,ll>,ll>
#define ppii pair<pair<ll,ll>,pair<ll,ll>>
#define fi first
#define se second
#define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x
#define Full(a) memset(a,0,sizeof(a))
#define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout);
using namespace std;
typedef double db;
typedef unsigned long long ull;
typedef long long ll;
bool Begin;
const ll N=19,M=(1ll<<N)+10;
const db Eps=1e-6;
inline ll read(){
    ll x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')
          f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}
inline void write(ll x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)
	  write(x/10);
	putchar(x%10+'0');
}
ll T,n;
ll a[N][N];
ll dp[M];
db x[N],y[N];
pair<db,db> get(db x1,db y1,db x2,db y2){
	db a=(y1*x2-x1*y2)/(x1*x1*x2-x1*x2*x2);
	db b=(y1*x2*x2-y2*x1*x1)/(x1*x2*x2-x1*x1*x2);
	return {a,b};
}
db get(db x,db a,db b){
	return a*x*x+b*x;
}
void solve(){
	memset(dp,0x7f,sizeof(dp));
	n=read(),read();
	for(int i=1;i<=n;i++)
	  scanf("%lf%lf",&x[i],&y[i]);
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			a[i][j]=0;
			auto t=get(x[i],y[i],x[j],y[j]);
			if(t.fi>=0)
			  continue;
			for(int k=1;k<=n;k++){
				db h=get(x[k],t.fi,t.se);
				if(abs(h-y[k])<=Eps)
				  a[i][j]|=(1ll<<(k-1));
			}
		}
	} 
	dp[0]=0;
	for(int S=0;S<(1ll<<n);S++){
		for(int i=1;i<=n;i++){
			for(int j=i+1;j<=n;j++){
				if((a[i][j]&S)==a[i][j])
				  continue;
				dp[S|a[i][j]]=min(dp[S|a[i][j]],dp[S]+1);
			}
		}
		for(int i=1;i<=n;i++)
		  dp[S|(1ll<<(i-1))]=min(dp[S|(1ll<<(i-1))],dp[S]+1);
	} 
	write(dp[(1ll<<n)-1]);
	putchar('\n');
}
bool End;
int main(){
	T=read();
	while(T--)
	  solve();
	cerr<<'\n'<<abs(&Begin-&End)/1048576<<"MB";
	return 0;
}

标签:NOIP2016,frac,1x,db,P2831,小鸟,x2,dp,define
From: https://www.cnblogs.com/rgw2010/p/18342379

相关文章

  • 小鸟影视苹果cms整站源码带采集规则+支付接口+搭建教程
    小鸟影视苹果cms整站源码带采集规则+支付接口+搭建教程###小鸟影视苹果CMS整站源码带采集规则+支付接口+搭建教程在数字化时代,视频内容的需求日益增长,搭建一个功能齐全的视频网站成为了许多创业者的选择。小鸟影视苹果CMS整站源码是一个集成了采集规则和支付接口的解决方案,......
  • P2119 [NOIP2016 普及组] 魔法阵
    P2119[NOIP2016普及组]魔法阵传送门1我们可以先写出\(O(m^4)\)的暴力#include<bits/stdc++.h>#defineintlonglong#definePIIpair<int,int>usingnamespacestd;constintinf=0x3f3f3f3f;constintMOD=1e9+7,N=4e4+5;intn,m,ans[N......
  • 【C语言】Linux 飞翔的小鸟
    【C语言】Linux飞翔的小鸟零、环境部署安装Ncurses库sudoapt-getinstalllibncurses5-dev壹、编写代码代码如下:bird.c#include<stdio.h>#include<time.h>#include<stdlib.h>#include<signal.h>#include<curses.h>#include<sys/time.h>#include<u......
  • 524. 愤怒的小鸟
    //524.愤怒的小鸟.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>usingnamespacestd;/*https://www.acwing.com/problem/content/526/Kiana最近沉迷于一款神奇的游戏无法自拔。   简单来说,这款游戏是在一个平面上进行的。......
  • Java课程设计:基于swing的飞翔的小鸟小游戏
    文章目录一、项目介绍二、核心代码三、项目展示四、源码获取一、项目介绍这个基于Swing框架的"飞翔的小鸟"课程设计项目是一个非常有趣且富有挑战性的Java编程练习,可以帮助学生学习图形用户界面编程和游戏开发的基础知识。该项目的主要目标是开发一个简单的游......
  • [lnsyoj166/luoguP2822/NOIP2016提高组] 组合数问题
    题意原题链接给定\(n,m,k\),对于所有的\(0\lei\len,0\lej\lemin\{i,m\}\),有多少对\((i,j)\)满足\(k|(^i_j)\)sol在解决组合数问题时,若遇到\(n,m\le2000\)的情况,可以使用递推法(杨辉三角)来进行\(O(n^2)\)的预处理,再\(O(1)\)直接调用递推法求组合数\[(^n_m)=(^{n-1}_m)+(......
  • 【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
    最终效果前言欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第29篇中,我们将探索如何用unity复刻经典游戏《愤怒的小鸟》,我会附带项目源码,以便你更好理解它。简单搭建环境修改图片配置并切图,修改最大尺寸是为了让图......
  • CSP历年复赛题-P2119 [NOIP2016 普及组] 魔法阵
    原题链接:https://www.luogu.com.cn/problem/P2119题意解读:在一组数里找出所有的Xa,Xb,Xc,Xd的组合,使得满足Xa<Xb<Xc<Xd,Xb-Xa=2(Xd-Xc),Xb-Xa<(Xc-Xb)/3,并统计出每个数作为A,B,C,D出现的次数。解题思路:1、枚举(O(n^4))首先想到的是通过4重循环枚举所有可能的Xa,Xb,Xc,Xd,然后判......
  • 小鸟的设备
    小鸟的设备题目背景小鸟有$n$个可同时使用的设备。题目描述第$i$个设备每秒消耗$a_i$个单位能量。能量的使用是连续的,也就是说能量不是某时刻突然消耗的,而是匀速消耗。也就是说,对于任意实数,在$k$秒内消耗的能量均为$k\timesa_i$单位。在开始的时候第$i$个设备里......
  • CSP历年复赛题-P2058 [NOIP2016 普及组] 海港
    原题链接:https://www.luogu.com.cn/problem/P2058题意解读:计算24小时时间窗口内不同国家的数量,是队列的典型应用。解题思路:本题需要用到两个关键的数据结构:队列、数组队列用来保存24小时内到达的船的时间,数组用来保存24小时内每个国家有多少人每到一只船,需要把时间放入队列,如......