95pts求助(注释详细)
查看原帖
95pts求助(注释详细)
1305692
xiangixuan楼主2025/6/26 16:08

WA#8

已经看过帖子如果你 WA on #8,应该不是这个问题QwQ.

哪位大佬帮我看看

#include<bits/stdc++.h>
#define N 19
using namespace std;

int t, n, m;
double px[N], py[N];
int f[1<<N];

int get(int i, int j) {
	double a, b;
	
	if(px[i]==px[j]) return 0;
	a=1.0*(py[j]-(py[i]/px[i]*px[j]))/(px[j]*(px[j]-px[i]));
	b=1.0*py[i]/px[i]-a*px[i];
	if(a>=0) return 0;
	//确定抛物线
	
	int t=0;
	for(int k=1; k<=n; ++k)
		if(abs(1.0*a*px[k]*px[k]+b*px[k]-py[k])<=1e-6)
			t|=(1<<(k-1));
  	//返回能被杀的所有猪的压缩状态
	return t;
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> t;
	while(t--) {
		cin >> n >> m;
		for(int i=1; i<=n; ++i)
			cin >> px[i] >> py[i];
		for(int i=1; i<1<<n; ++i) f[i]=1e9;
		for(int i=1; i<1<<n; ++i) {
			for(int j=1; j<=n; ++j) {
				if(!((i>>(j-1))&1)) continue;

				f[i]=min(f[i], f[i^(1<<(j-1))]+1);
				//用一条抛物线单杀j号猪

				for(int k=j+1; k<=n; ++k) {
					if(!((i>>(k-1))&1)) continue;
					f[i]=min(f[i], f[i^get(j, k)]+1);
					//杀j、k两只猪,同时看看能不能杀别的猪

				}
			}
		}
		cout << f[(1<<n)-1] << '\n';
	}
	return 0;
}
2025/6/26 16:08
加载中...