Title Description
Kiana recently addicted to a magical game can not extricate themselves.
In short, the game is done on a flat surface.
There is a slingshot located at (0,0), each time Kiana can use it to the first quadrant to launch a red bird, the birds flying trajectory is shaped like the y=ax2+bx curve, where a, B is the Kiana specified parameters, and must meet the a<0.
When the bird falls back to the ground (i.e. the x-axis), it disappears instantly.
In a certain level of the game, there are n green piglets in the first quadrant of the plane, where the xi,yi is in the coordinates of the piglet.
If the flight path of a bird passes through (xi,yi), then the first pig will be wiped out, and the bird will continue to fly along the original trajectory;
If the flight path of a bird does not pass (Xi,yi), then the whole process of flying the bird will not have any effect on the first piglet.
For example, if two piglets were located (1,3) and (3,3), Kiana could choose to launch a bird with a flying trajectory of y=-x2+4x, so that two little pigs would be wiped out with the bird.
And the purpose of this game is to kill all the piglets by launching a bird.
Each level of this magical game is difficult for Kiana, so Kiana also entered some mysterious instructions to make it easier to complete the game. These instructions will be detailed in the "input format".
Assuming that the game has a total of t levels, now Kiana want to know, for each level, at least the number of birds to be fired to destroy all the pigs. Since she won't count, I hope you'll tell her.
Input
The first line contains a positive integer t, which represents the total number of levels in the game.
Enter the information for this T-level in turn. The first row of each level contains two non-negative integer n,m, each representing the number of piglets in the level and the mysterious instruction type of the Kiana input. In the next n rows, the line I contains two positive real numbers (Xi,yi), which indicates that the first piglet coordinates are (xi,yi). The data guarantees that there are no two pigs in the same level with exactly the same coordinates.
If m=0, indicates that Kiana has entered an instruction that does not have any effect.
If m=1, then this level will be satisfied: at most with n/3+1 only birds can destroy all piglets.
If the m=2, then this level will be satisfied: there must be an optimal solution, in which a bird killed at least n/3 pigs.
Guaranteed 1<=n<=18,0<=m<=2,0<xi,yi<10, the real number in the input is retained to two digits after the decimal point.
Output
Output one line of answers to each level.
Each line of the output contains a positive integer that represents the minimum number of birds needed to destroy all piglets in the corresponding level.
Sample input
22 01.00 3.003.00 3.005 21.00 5.002.00 8.003.00 9.004.00 8.005.00 5.00
Sample output
11
Exercises
Pressure DP. state[i] [j] indicates the state of the pig through the parabola of the i,j two pigs; dp[i] indicates the number of birds required for the current pig's status of I, of which 1 indicates that the pig in this position has been beaten, and 0 indicates that it has not been hit.
#include <cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespacestd;#definell Long LongConst intMaxn= (1<< +);Const Doubleeps=1e-8;intn,m,t,state[ -][ -],judge[ -],DP[MAXN];structpig{Doublex, y;} a[ -];intCalcintD1,intD2) { Doublex1=a[d1].x,y1=a[d1].y; DoubleX2=a[d2].x,y2=a[d2].y; if(Fabs (X1-X2) <=eps)return 0; Doubletx=x1*x1*x2-x2*x2*x1,ty=y1*x2-y2*X1; Doubleaa=ty/tx,b= (Y1-AA*X1*X1)/X1; if(aa>=0)return 0; intres=0; JUDGE[D1]=judge[d2]=1; for(intI=1; i<=n;i++){ Doublex=a[i].x,y=a[i].y; if(Fabs (AA*X*X+B*X-Y) <EPS) Res|=1<< (I-1), dp[1<< (I-1)]=dp[res]=1; } returnRes;} Template<typename t>voidRead (t&AA) { Charcc ll Ff;aa=0; Cc=getchar (); ff=1; while((cc<'0'|| Cc>'9') &&cc!='-') cc=GetChar (); if(cc=='-') ff=-1, cc=GetChar (); while(cc>='0'&&cc<='9') aa=aa*Ten+cc-'0', cc=GetChar (); AA*=ff;}intMain () {read (T); while(t--) {memset (DP,127,sizeof(DP)); memset (judge,0,sizeof(judge)); Read (n), read (m); for(intI=1; i<=n;i++) {scanf ("%LF%LF",&a[i].x,&a[i].y); dp[1<< (I-1)]=1; } for(intI=1; i<=n;i++) for(intj=i+1; j<=n;j++) State[i][j]=Calc (i,j); for(intI=1;i< (1<<N); i++) for(intj=1; j<=n;j++){ if((I>> (J-1)) &1))Continue; if(!Judge[j]) {Dp[i| (1<< (J-1))]=min (dp[i|1<< (J-1)],dp[i]+1); Continue; } for(intk=j+1; k<=n;k++){ if((I>> (K-1)) &1))Continue; Dp[i|state[j][k]]=min (dp[i|state[j][k]],dp[i]+1); } dp[i| (1<< (J-1))]=min (dp[i|1<< (J-1)],dp[i]+1); } printf ("%d\n", dp[(1<<n)-1]); } return 0;}
"noip2016" Angry Birds