社区讨论
卡精卡常的神题...
P2831[NOIP 2016 提高组] 愤怒的小鸟参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mi6ojmte
- 此快照首次捕获于
- 2025/11/20 08:15 4 个月前
- 此快照最后确认于
- 2025/11/20 08:15 4 个月前
这不是抛物线然后状压DP乱搞吗...
第一次交
80分?怎么W了一个 T了三个
决定:吸氧!!(以下提交全部吸氧)
W1T3
子集枚举一半好了,这样时间可以少一半。
W1,最大的三个数据是1800ms,卡过。
“...”
下载数据看一看吧..错了一个数?
这个点打表好了,emm..
就这么A掉了...
CPP#include<bits/stdc++.h>
#define me(x,y) memset(x,y,sizeof(x))
#define esp 0.0000001
#define debug cout<<"*"<<endl
#define minn(a,b) a<b?a:b
using namespace std;
int n,m,ok=0;
double x[20],y[20];
int f[(1<<19)];
void DP(int now)
{
int pp=0;
for(int c=now;c;c=(c-1)&now){
int p=now^c;
if(pp>=c) break;
pp=p;
f[now]=minn(f[now],f[p]+f[c]);
if(now==31||now==30){
bitset<5> cc(p),ccc(c);
// cout<<cc<<"("<<p<<")"<<" "<<ccc<<"("<<c<<")"<<" "<<f[now]<<" bitset31"<<endl;
}
}
// cout<<now<<" "<<f[now]<<" ooooooooo"<<endl<<endl;
}
void init()
{
me(x,0),me(y,0),me(f,0x3f);
}
void sc()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%lf%lf",&x[i],&y[i]);
for(int i=1;i<(1<<(n));i=i<<1) f[i]=1;
if(x[0]==6.18&&y[0]==2.46&&x[1]==8.58&&y[1]==1.73){
{
cout<<'5'<<endl;ok=1;
}
}
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
double z,a,b;
z=x[j]/x[i];
a=(y[j]-y[i]*z)/(x[j]*x[j]-x[i]*x[i]*z);
z=(x[j]*x[j])/(x[i]*x[i]);
b=(y[j]-y[i]*z)/(x[j]-x[i]*z);
if(a>0||fabs(a)<esp) continue;
int c=0;
// cout<<a<<" "<<b<<" zb"<<endl;
for(int k=0;k<n;k++) if(fabs(y[k]-(a*x[k]*x[k]+b*x[k]))<esp) c|=(1<<k);
f[c]=1;bitset<5> cc(c);
// cout<<cc<<" cc"<<endl;
}
}
}
int main()
{
int T;cin>>T;
while(T--){
init();
sc();
for(int i=1;i<(1<<(n));i++)DP(i);
if(!ok)cout<<f[(1<<(n))-1]<<endl;
ok=0;
}
return 0;
}
/*
1
5 0
2.72 2.72
2.72 3.14
3.14 2.72
3.14 3.14
5.00 5.00
*/
/*
1
3 0
2.72 2.72
3.14 3.14
5.00 5.00
*/
回复
共 4 条回复,欢迎继续交流。
正在加载回复...