开O2最慢的样例也就1s,不开有三个点TLE了。
不知道还能怎么优化。
时间复杂度O((n^2)*2^n)
#include <bits/stdc++.h>
using namespace std;
#define fr(i, a, b) for (int i = a; i <= b; i++)
#define lc k<<1
#define rc k<<1|1
#define pk push_back
#define fs first
#define sc second
#define mkp make_pair
typedef long long ll;
typedef unsigned long long ull;
typedef double dou;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int maxn=2e5+3;
const ll inf = 1e9 + 7;
const ll mod = 1e9 + 7;
struct node{
dou x, y;
};
int vis[1 << 18];
int d[19][1 << 18];
int bitcount(int x){
int res = 0;
while(x){
if(vis[x]!=0){
return res + vis[x];
}
if(x&1)
res++;
x >>= 1;
}
return res;
}
void init(){
for (int i = 0; i < 1 << 18;i++){
vis[i] = bitcount(i);
}
}
void solve(){
memset(d, 0x3f3f, sizeof d);
int n, m;
scanf("%d%d",&n,&m);
vector<node> pig(n + 1);
vector<ll> g[n+1];
for (int i = 1; i <= n;i++){
scanf("%lf%lf", &pig[i].x, &pig[i].y);
//cout << pig[i].x << ' ' << pig[i].y << endl;
}
int ans = d[0][0];
for (int i = 1; i <= n;i++){
for (int j = 1; j <= n;j++){
dou a, b;
dou A1=pig[i].x*pig[i].x, A2=pig[j].x*pig[j].x, B1=pig[i].x, B2=pig[j].x, C1=pig[i].y, C2=pig[j].y;
if(B1 * A2 - B2 * A1==0)continue;
a = (B1 * C2 - B2 * C1) / (B1 * A2 - B2 * A1);
b = (A2 * C1 - A1 * C2) / (B1 * A2 - B2 * A1);
ll p=0;
if(a>=0)continue;
for (int k = 1; k <= n;k++){
if(fabs(a*pig[k].x*pig[k].x+b*pig[k].x-pig[k].y)<0.0000000001){
p = (p << 1) + 1;
}
else
p <<= 1;
}
g[i].pk(p);
d[i][p] = 1;
}
}
ans = min(min(ans, d[1][(1 << n) - 1]),n);
for (int i = 2; i <= n; i++)
{
for (ll s = 0; s < (1 << n); s++)
{
d[i][s] = min(min(d[i][s], d[i - 1][s]),vis[s]);
for (int j = 0; j < g[i].size();j++)
{
ll p = g[i][j] | s;
d[i][p] = min(min(d[i][p], d[i - 1][s] + 1),vis[p]);
}
}
ans = min(ans, d[i][(1 << n) - 1]);
}
printf("%d\n", ans);
}
int main()
{
int t=1;
init();
scanf("%d",&t);
while(t--)
{
solve();
}
system("pause");
return 0;
}