noip2016代码

----------------------------------------------------------------------------------

以下均为AC代码

-----------------------------------------------------------------------------------

Day1 T1

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
inline int read(){
    register int x=0;bool f=1;
    register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return f?x:-x;
}
const int N=1e5+10;
struct node{
    int f;
    char s[260];
    node(){
        f=0;
        memset(s,0,sizeof s);
    }
}e[N<<1];
int n,m;
int main(){
    n=read();m=read();
    for(int i=1;i<=n;i++){
        e[i].f=read();
        scanf("%s",&e[i].s);
    }
    int zj=1;
    for(int i=1,opt,p;i<=m;i++){
        opt=read();p=read();p%=n;
        if(!e[zj].f){
            if(opt){
                if(zj+p<=n) zj+=p;
                else zj=zj+p-n;
            }
            else{
                if(zj<=p) zj=n-p+zj;
                else zj-=p;
            }
        }
        else{
            if(!opt){
                if(zj+p<=n) zj+=p;
                else zj=zj+p-n;
            }
            else{
                if(zj<=p) zj=n-p+zj;
                else zj-=p;
            }
        }
    }
    printf("%s",e[zj].s);
    return 0;
}

Day1 T2

/*
题解:by shenben 
如果观察点x可以观察到u->v路径上的点:
1、u->fa:t[x]+de[x]=de[u]
2、fa->v: t[x]-de[x]=dis[u,v]-de[v]
对于每条路径:用差分去维护每个点的信息
对于答案统计:可以做dfs序,然后用主席树解决“区间有多少个某数”的问题
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#define me(a) memset(a,0,sizeof a)
using namespace std;
inline int read(){
    register int x=0;bool f=1;
    register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return f?x:-x;
}
const int N=3e5+10;
const int M=N*25;
int le[N],ri[N],dep[N],f[N][20],ans[N],t[N],tt[N],st[N],en[N],lca[N];
int sum[M],ls[M],rs[M],root[N*3];
struct node{
    int v,next;
}e[N<<1];
int n,m,now,num,tot,cnt,head[N];
void add(int x,int y){
    e[++tot].v=y;e[tot].next=head[x];head[x]=tot;
}
void dfs(int x,int fa){
    le[x]=++cnt;
    for(int i=head[x],v;i;i=e[i].next){
        if((v=e[i].v)!=fa){
            dep[v]=dep[x]+1;
            f[v][0]=x;
            dfs(v,x);
        }
    }
    ri[x]=cnt;
}
int calc_lca(int a,int b){
    if(dep[a]<dep[b]) swap(a,b);
    int t=dep[a]-dep[b];
    for(int i=0;i<=18;i++){
        if(1<<i&t){
            a=f[a][i];
        }
    }
    if(a==b) return a;
    for(int i=18;i>=0;i--){
        if(f[a][i]!=f[b][i]){
            a=f[a][i];
            b=f[b][i];
        }
    }
    return f[a][0];
}
void change(int &rt,int l,int r,int pos,int val){
    if(!pos) return ;
    if(!rt) rt=++num;
    sum[rt]+=val;
    if(l==r) return ;
    int mid=l+r>>1;
    if(pos<=mid) change(ls[rt],l,mid,pos,val);
    else change(rs[rt],mid+1,r,pos,val);
}
int query(int rt,int l,int r,int x,int y){
    if(!rt) return 0;
    if(l==x&&r==y) return sum[rt];
    int mid=l+r>>1;
    if(y<=mid) return query(ls[rt],l,mid,x,y);
    else if(x>mid) return query(rs[rt],mid+1,r,x,y);
    else return query(ls[rt],l,mid,x,mid)+query(rs[rt],mid+1,r,mid+1,y);
}
void Cl(){
    num=0;me(ls);me(rs);me(sum);me(root);
}
int main(){
    n=read();m=read();
    for(int i=1,x,y;i<n;i++){
        x=read();y=read();
        add(x,y);add(y,x);
    }
    dep[1]=1;
    dfs(1,0);
    for(int j=1;j<=18;j++){
        for(int i=1;i<=n;i++){
            f[i][j]=f[f[i][j-1]][j-1];
        }
    }
    for(int i=1;i<=n;i++) t[i]=read();
    for(int i=1;i<=m;i++) st[i]=read(),en[i]=read(),lca[i]=calc_lca(st[i],en[i]);
    for(int i=1;i<=n;i++) tt[i]=t[i]+dep[i];
    for(int i=1;i<=m;i++){
        now=dep[st[i]];
        change(root[now],1,n,le[st[i]],1);
        change(root[now],1,n,le[f[lca[i]][0]],-1);
    }
    for(int i=1;i<=n;i++) ans[i]+=query(root[tt[i]],1,n,le[i],ri[i]);
    Cl();
    for(int i=1;i<=n;i++) tt[i]=t[i]-dep[i]+n+1;
    for(int i=1;i<=m;i++){
        now=dep[st[i]]-(dep[lca[i]]<<1)+n+1;
        change(root[now],1,n,le[en[i]],1);
        change(root[now],1,n,le[lca[i]],-1);
    }
    for(int i=1;i<=n;i++) ans[i]+=query(root[tt[i]],1,n,le[i],ri[i]);
    for(int i=1;i<=n;i++) printf("%d ",ans[i]);
    return 0;
}

Day1 T3

#include<cstdio>
#include<cstring>
#include<iostream>
#define DB double
#define inf 0x3f3f3f3f
using namespace std;
inline int read(){
    register int x=0;bool f=1;
    register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return f?x:-x;
}
const int N=310;
const int M=2010;
int n,m,V,E,f[N][N];
int c[M],d[M];
DB K[M],dp[2][M][2];
void init(){
    memset(f,inf,sizeof f);
    n=read();m=read();V=read();E=read();
    for(int i=1;i<=n;i++) c[i]=read();
    for(int i=1;i<=n;i++) d[i]=read();
    for(int i=1;i<=n;i++) scanf("%lf",&K[i]);
    for(int i=1,x,y,z;i<=E;i++){
        x=read();y=read();z=read();
        f[x][y]=min(f[x][y],z);
        f[y][x]=min(f[y][x],z);
    }
}
void floyed(){
    for(int i=1;i<=V;i++) f[i][i]=0;
    for(int k=1;k<=V;k++){
        for(int i=1;i<=V;i++){
            for(int j=1;j<=V;j++){
                if(i!=j&&i!=k&&j!=k){
                    f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
                }
            }
        }
    }
}
void work(){
    //memset(dp,0x7fffffff,sizeof dp);对double类型慎用 
    for(int i=0;i<=1;i++){
        for(int j=0;j<=m;j++){
            dp[i][j][0]=dp[i][j][1]=inf;
        }
    }
    int now=1;
    dp[1][0][0]=0;dp[1][1][1]=0;
    for(int i=2;i<=n;i++){
        now^=1;
        dp[now][0][0]=dp[now^1][0][0]+f[c[i-1]][c[i]];
        for(int j=1;j<=min(i,m);j++){
            dp[now][j][0]=min(dp[now^1][j][0]+f[c[i-1]][c[i]],dp[now^1][j][1]+K[i-1]*f[d[i-1]][c[i]]+(1-K[i-1])*f[c[i-1]][c[i]]);
            dp[now][j][1]=min(dp[now^1][j-1][0]+K[i]*f[c[i-1]][d[i]]+(1-K[i])*f[c[i-1]][c[i]],dp[now^1][j-1][1]+K[i-1]*K[i]*f[d[i-1]][d[i]]+(1-K[i-1])*K[i]*f[c[i-1]][d[i]]+K[i-1]*(1-K[i])*f[d[i-1]][c[i]]+(1-K[i-1])*(1-K[i])*f[c[i-1]][c[i]]);
        }
    }
    DB ans=inf;
    for(int i=0;i<=m;i++) ans=min(ans,min(dp[now][i][0],dp[now][i][1]));
    printf("%.2lf",ans);
}
int main(){
    init();
    floyed();
    work();
    return 0;
}

Day2 T1

#include<cstdio>
#include<ios>
using namespace std;
inline int read(){
    register int x=0;bool f=1;
    register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return f?x:-x;
}
const int N=2010;
int n,m,k,T;
int C[N][N],S[N][N];
void prepare(){
    for(int i=0;i<=2000;i++){
        C[i][0]=1%k;
        for(int j=1;j<=i;j++){
            C[i][j]=(C[i-1][j]+C[i-1][j-1])%k;
        }
    }
    S[0][0]=(C[0][0]==0);
    for(int i=1;i<=2000;i++){
        for(int j=1;j<=i;j++){
            if(!j){
                S[i][j]=S[i-1][j]+(C[i][j]==0);
            }
            else if(i==j){
                S[i][j]=S[i][j-1]+(C[i][j]==0);
            }
            else{
                S[i][j]=S[i-1][j]+S[i][j-1]-S[i-1][j-1]+(C[i][j]==0);
            }
        }
    }
}
int main(){
    T=read(),k=read();
    prepare();
    for(;T--;){
        n=read();m=read();
        printf("%d
",S[n][min(n,m)]);
    }
    return 0;
}

Day2 T2

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define DB double
using namespace std;
inline int read(){
    register int x=0;bool f=1;
    register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return f?x:-x;
}
const int N=1e5+5,M=7e6+5;
int n,m,q,u,v,t;
int mark,q0[N],q1[M],q2[M];
int main(){
    n=read();m=read();q=read();u=read();v=read();t=read();
    memset(q0,-0x3f,sizeof q0);
    memset(q1,-0x3f,sizeof q1);
    memset(q2,-0x3f,sizeof q2);
    int h0=0,t0=n,h1=0,t1=0,h2=0,t2=0;
    for(int i=0;i<n;i++) q0[i]=read();
    sort(q0,q0+n,greater<int>());
    DB p=(DB)u/(DB)v;
    for(int i=1,x,x1;i<=m;i++){
        x=max(q0[h0],max(q1[h1],q2[h2]));
        if(x==q0[h0]) h0++;
        else if(x==q1[h1]) h1++;
        else h2++;
        x1=(x+=mark)*p;mark+=q;
        q1[t1++]=x1-mark;
        q2[t2++]=x-x1-mark;
        if(i%t) continue;
        printf("%d ",x);
    }
    putchar('
');
    for(int i=1,x;i<=n+m;i++){
        x=max(q0[h0],max(q1[h1],q2[h2]));
        if(x==q0[h0]) h0++;
        else if(x==q1[h1]) h1++;
        else h2++;
        if(i%t) continue;
        printf("%d ",x+mark);
    }
    return 0;
}

Day2 T3

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#define DB double
using namespace std;
const int N=20;
const DB eps=1e-7;
int T,n,s[N][N],dp[1<<N-1];
DB fm,a,b,x[N],y[N];
int main(){
    ios::sync_with_stdio(false);
    for(cin>>T;T--;){
        memset(dp,0x3f,sizeof dp);
        int i,j,k,sta;
        cin>>n>>i;
        for(i=1;i<=n;i++) cin>>x[i]>>y[i];
        for(i=1;i<=n;i++){
            for(j=i+1;j<=n;j++){
                fm=x[i]*x[j]*(x[i]-x[j]);
                a=x[j]*y[i]-x[i]*y[j];
                b=x[i]*x[i]*y[j]-x[j]*x[j]*y[i];
                s[i][j]=0;
                if(a*fm<0){
                    for(k=1;k<=n;k++){
                        if(fabs(a*x[k]*x[k]+b*x[k]-y[k]*fm)<eps){
                            s[i][j]|=(1<<k-1);
                        }
                    }
                }
            }
        }
        dp[0]=0;
        for(sta=0;sta<(1<<n);sta++){
            if(sta<0x3f3f3f3f){
                for(i=0;1<<i&sta;i++);i++;
                dp[1<<i-1|sta]=min(dp[1<<i-1|sta],dp[sta]+1);
                for(j=i+1;j<=n;j++){
                    dp[sta|s[i][j]]=min(dp[sta|s[i][j]],dp[sta]+1);
                }
            }
        }
        printf("%d
",dp[sta-1]);
    }
    return 0;
}

----------------------------------------------------------------------------------

以下为暴力代码

-----------------------------------------------------------------------------------

Day1 T2

//本代码为25分,加特判链、起点、终点可以拿60分 
#pragma comment(linker,"/STACK:102400,102400")
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read(){
    register int x=0;bool f=1;
    register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return f?x:-x;
}
const int N=3e5+10;
struct node{
    int v,next;
}e[N<<1];
struct ss{
    int a,b,anc;
}lca[N];
int n,m,tot,head[N],dep[N],f[N][21];
int W[N],ans[N];
int tmp[N];
void add(int x,int y){
    e[++tot].v=y;
    e[tot].next=head[x];
    head[x]=tot;
}
void dfs(int x,int fa,int de){
    dep[x]=de;
    f[x][0]=fa;
    for(int i=head[x];i;i=e[i].next){
        int v=e[i].v;
        if(v!=fa){
            dfs(v,x,de+1);
        }
    }
}
int calc_lca(int a,int b){
    if(dep[a]<dep[b]) swap(a,b);
    int t=dep[a]-dep[b];
    for(int i=0;i<=20;i++){
        if((1<<i)&t){
            a=f[a][i];
        }
    }
    if(a==b) return a;
    for(int i=20;i>=0;i--){
        if(f[a][i]!=f[b][i]){
            a=f[a][i];
            b=f[b][i];
        }
    }
    return f[a][0];
}
#define name "running"
int main(){
    n=read();m=read();
    for(int i=1,x,y;i<n;i++){
        x=read();y=read();
        add(x,y);add(y,x);
    }
    dfs(1,1,0);
    for(int j=1;j<=20;j++){
        for(int i=1;i<=n;i++){
            f[i][j]=f[f[i][j-1]][j-1];
        }
    }
    for(int i=1;i<=n;i++) W[i]=read();
    for(int i=1,x,y;i<=m;i++){
        lca[i].a=read();
        lca[i].b=read();
        lca[i].anc=calc_lca(lca[i].a,lca[i].b);
    }
    for(int j,k,i=1;i<=m;i++){
        int x=lca[i].a,y=lca[i].b;
        for(j=0;x!=lca[i].anc;j++){
            if(j==W[x]) ans[x]++;
            x=f[x][0];
        }
        if(j==W[lca[i].anc]) ans[lca[i].anc]++;
        tmp[0]=0;
        for(;y!=lca[i].anc;){
            tmp[++tmp[0]]=y;
            y=f[y][0];
        }
        reverse(tmp+1,tmp+tmp[0]+1);
        for(k=1;k<=tmp[0];k++){
            if(j+k==W[tmp[k]]) ans[tmp[k]]++;
        }
    }
    for(int i=1;i<n;i++) printf("%d ",ans[i]);printf("%d",ans[n]);
    return 0;
}

Day1 T3

//本代码76分,貌似暴力最多80分 
#include<cstdio>
#include<cstring>
#include<iostream>
#define DB double
using namespace std;
inline int read(){
    register int x=0;bool f=1;
    register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return f?x:-x;
}
const int N=310;
const int M=2010;
int n,m,V,E,f[N][N];
int c[M],d[M];
DB miss,ans=1e9;
DB K[M];
bool ok1[M],ok2[M];
void init(){
    memset(f,0x3f3f3f3f,sizeof f);
    n=read();m=read();V=read();E=read();
    for(int i=1;i<=n;i++) c[i]=read();
    for(int i=1;i<=n;i++) d[i]=read();
    for(int i=1;i<=n;i++) scanf("%lf",&K[i]);
    for(int i=1,x,y,z;i<=E;i++){
        x=read();y=read();z=read();
        if(x==y) continue;
        f[x][y]=min(f[x][y],z);
        f[y][x]=min(f[y][x],z);
    }
}
void floyed(){
    for(int i=1;i<=V;i++) f[i][i]=0;
    for(int k=1;k<=V;k++){
        for(int i=1;i<=V;i++){
            for(int j=1;j<=V;j++){
                if(i!=j&&i!=k&&j!=k){
                    f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
                }
            }
        }
    }
}
DB check2(DB lv){
    int now,tot=0;
    now=ok2[1]?d[1]:c[1];
    for(int i=2;i<=n;i++){
        if(ok2[i]){
            if(now!=d[i]) tot+=f[now][d[i]];
            now=d[i];
        }
        else{
            if(now!=c[i]) tot+=f[now][c[i]];
            now=c[i];
        }
    }
    return lv*(DB)tot;
}
void dfs2(int x,DB lv){
    if(x==n+1){
        miss+=check2(lv);return ;
    }
    if(!ok1[x]){
        dfs2(x+1,lv);
    }
    else{
        dfs2(x+1,lv*(1.0-K[x]));
        ok2[x]=1;
        dfs2(x+1,lv*K[x]);
        ok2[x]=0;
    }
}
void merge(){
    miss=0;
    dfs2(1,1.0);
    ans=min(ans,miss);
}
void dfs1(int x,int t){
    if(t>m) return ;
    if(x==n+1){
        merge();return ;
    }
    dfs1(x+1,t);
    ok1[x]=1;
    dfs1(x+1,t+1);
    ok1[x]=0;
}
int main(){
    init();
    floyed();
    if(!m){
        printf("%.2lf",check2(1.0));
    }
    else{
        dfs1(1,0);
        printf("%.2lf",ans);
    }
    return 0;
} 

Day2 T1

//本代码80分,加前缀和可以AC 
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
inline int read(){
    register int x=0;bool f=1;
    register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return f?x:-x;
}
const int N=2010;
const int M=3010;
int n,m,k,T;
int tot,c[M],prime[M/3];
bool check[M];
short C[N][N];
void prepare(){
    n=3000;
    for(int i=2;i<=n;i++){
        if(!check[i]) prime[++tot]=i;
        for(int j=1;j<=tot&&prime[j]*i<=n;j++){
            check[prime[j]*i]=1;
            if(i%prime[j]==0) break;
        }
    }
}
void Add(ll x){
    if(x<2) return ;
    for(int i=1;i<=tot;i++){
        ll r=x,p=prime[i];
        if(r<p) break;
        while(r) c[i]+=(r/=p);
    }
}
void Del(ll x){
    if(x<2) return ;
    for(int i=1;i<=tot;i++){
        ll r=x,p=prime[i];
        if(r<p) break;
        while(r) c[i]-=(r/=p);
    }
}
ll fpow(ll a,ll p,ll mod){
    ll res=1;
    for(;p;p>>=1,a=a*a%mod) if(p&1) res=res*a%mod;
    return res;
}
int calc(ll n,ll m){
    memset(c,0,sizeof c);
    Add(n);
    Del(m);
    Del(n-m);
    ll res=1;
    for(int i=1;i<=tot;i++){
        if(c[i]>0) res=res*fpow(prime[i],c[i],k)%k;
        if(!res) return 1;
        if(prime[i]>n) break;
    }
    return 0;
}
int ans;
int main(){
    memset(C,-1,sizeof C);
    prepare();
    for(T=read(),k=read();T--;){
        ans=0;
        n=read();m=read();
        for(int i=0;i<=n;i++){
            for(int j=0;j<=min(i,m);j++){
                if(C[i][j]==1) {ans++;continue;}
                else if(C[i][j]==0) continue;
                C[i][j]=calc(i,j);
                if(C[i][j]) ans++;
            }
        }
        printf("%d
",ans);
    }
    return 0;
}

Day2 T2

//本代码45分,貌似暴力的极限就是50分 
#include<cstdio>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
inline int read(){
    register int x=0;bool f=1;
    register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return f?x:-x;
}
#define DB double
const int N=7e6+10;
const int M=1e5+10;
int num,n,m,q,u,v,t;
int s[N+M];
int cnt,ans[N];
bool cmp(const int &a,const int &b){
    return a>b;
}
priority_queue<int>que;
int main(){
    n=read();m=read();q=read();u=read();v=read();t=read();
    DB p=(DB)u/(DB)v;
    for(int i=1;i<=n;i++) s[i]=read();
    if(!q){
        for(int i=1;i<=n;i++) que.push(s[i]);
        for(int i=1,x;i<=m;i++){
            x=que.top();que.pop();
            ans[++ans[0]]=x;
            int x1=floor((DB)x*p);
            int x2=x-x1;
            que.push(x1);
            que.push(x2);
        }
        for(int i=t;i<=ans[0];i+=t) printf("%d ",ans[i]);
        putchar('
');
        while(!que.empty()) s[++cnt]=que.top(),que.pop();
        for(int i=1+t-1;i<=cnt;i+=t) printf("%d ",s[i]);
        return 0;
    }
    int top=n;
    for(int i=1;i<=m;i++){
        int maxn=0,pj=0;
        for(int j=1;j<=top;j++){
            if(s[j]>maxn){
                maxn=s[j];
                pj=j;
            }
        }
        ans[++ans[0]]=maxn;
        int x1=floor((DB)maxn*p);
        int x2=maxn-x1;
        for(int j=1;j<=top;j++) s[j]+=q;
        s[pj]=x1;
        s[++top]=x2;
    }
    sort(s+1,s+top+1,cmp);
    for(int i=t;i<=ans[0];i+=t) printf("%d ",ans[i]);
    putchar('
');
    for(int i=1+t-1;i<=top;i+=t) printf("%d ",s[i]);
    return 0;
}

Day2 T3

//本代码50分,貌似暴力最多可以拿65分 
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define N 21
using namespace std;
int n,m,limit,ok[N],ans;
double x[N],y[N],a,b;
void check(int i,int j){
    double x1=x[i],x2=x[j],y1=y[i],y2=y[j];
    double P=x1/x2;
    a=(y2*P-y1)/(x2*x1-x1*x1);
    b=(y1-a*x1*x1)/x1;
}
void dfs(int t){
    if(t>limit) return;
    if(t>=ans) return;
    int flag=0;
    for(int i=1;i<=n;i++){
        if(ok[i]) continue;
        ok[i]=1;flag=1;int fl2=0;
        for(int j=i+1;j<=n;j++){
            if(ok[j]) continue;
            check(i,j);
            if(a>=0) continue;
            ok[j]=1;fl2=1;
            int num=0;
            for(int k=j+1;k<=n;k++){
                double yy=a*x[k]*x[k]+b*x[k]-y[k];
                if(fabs(yy)<=0.001){
                    ok[k]=1;
                }
            }
            dfs(t+1),ok[i]=ok[j]=0;
        }
        if(!fl2)dfs(t+1),ok[i]=0;
    }
    if(!flag){
        ans=min(ans,t);
        return;
    }
}
void work(){
    scanf("%d%d",&n,&m);
    if(m==0)limit=n;
    else if(m==1)limit=min(n/3+1,n);
    else limit=min(n,n-n/3);
    for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
    dfs(0);
    printf("%d
",ans);
}
int main(){
    int T;scanf("%d",&T);
    while(T--){
        memset(ok,0,sizeof(ok));
        ans=N;
        work();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/shenben/p/6132085.html