NOIP2016 Day2

T1

楊輝三角算組合數+二維前綴和
水爆
分值:100

CODE

#include<cstdio>
#define N 2005
int C[N][N],cnt[N][N],t,k,n,m;
int main() {
    scanf("%d %d",&t,&k);
    for(int i=1;i<=2000;i++){
        C[i][0]=C[i][i]=1;
        for(int j=1;j<i;j++){
            cnt[i][j]=cnt[i-1][j]+cnt[i][j-1]-cnt[i-1][j-1];
            C[i][j]=(C[i-1][j]+C[i-1][j-1])%k;
            if(C[i][j]==0)cnt[i][j]++;
        }
        cnt[i][i]=cnt[i][i-1];
    }
    while(t--) {
        scanf("%d %d",&n,&m);
        printf("%d\n",cnt[n][n<m?n:m]);
    }
    return 0;
}

T2

三個數組模擬單調隊列
分值:100

CODE

#include<cstdio>
#include<algorithm>
#define N 100005
#define M 7100005
using namespace std;
int n,m,q,u,v,t;
double p;
int Q[N],Q2[M],Q3[M],l1=1,l2=1,l3=1,r1,r2,r3;
inline int top() {
    int t1=-2e9,t2=-2e9,t3=-2e9;
    if(l1<=r1)t1=Q[l1];
    if(l2<=r2)t2=Q2[l2];
    if(l3<=r3)t3=Q3[l3];
    if(t1>=t2&&t1>=t3) {
        l1++;
        return t1;
    }
    if(t2>=t1&&t2>=t3) {
        l2++;
        return t2;
    }
    l3++;
    return t3;
}
bool cmp(int _,int __) {return _>__;}

int main() {
    int i;
    scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
    p=1.0*u/v;
    for(i=1; i<=n; i++)scanf("%d",&Q[i]);
    sort(Q+1,Q+1+n,cmp);
    r1=n;
    int inc=0;
    for(i=1; i<=m; i++) {
        int x=top()+inc;
        inc+=q;
        Q2[++r2]=floor(x*p)-inc;
        Q3[++r3]=x-floor(x*p)-inc;
        if(i%t==0)printf("%d ",x);
    }
    puts("");
    for(i=1; i<=n+m; i++) {
        int ans=top();
        if(i%t==0)printf("%d ",ans+q*m);
    }
    return 0;
}

T3

狀壓dp
分值:100

CODE

#include<cstdio>
#include<memory.h>
struct node {double x,y;} A[20];
int B[405],dp[1<<19];
inline void Min(int &x,int y){if(x>y)x=y;}
inline double Abs(double x){return x>0?x:-x;}
inline node calc(node x,node y) {
    double y1=x.y,y2=y.y;
    double k1=x.x*x.x,k2=y.x*y.x;
    double b1=x.x,b2=y.x;
    double s1=k1/k2,s2=b1/b2;
    node t;
    t.y=(y1-y2*s1)/(b1-b2*s1);
    t.x=(y1-y2*s2)/(k1-k2*s2);
    return t;
}

inline bool Judge(node a,node x,node y) {
    if(Abs(a.x*x.x*x.x+a.y*x.x-x.y)>1e-6)return 0;
    if(Abs(a.x*y.x*y.x+a.y*y.x-y.y)>1e-6)return 0;
    return 1;
}
int main() {
    int T;
    scanf("%d",&T);
    while(T--) {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)
            scanf("%lf%lf",&A[i].x,&A[i].y);
        int n1=0;
        for(int i=1; i<=n; i++) {
            for(int j=i+1; j<=n; j++) {
                node a1=calc(A[i],A[j]);
                if(a1.x>=0||!Judge(a1,A[i],A[j]))continue;
                int h=(1<<(i-1))|(1<<(j-1));
                for(int k=j+1; k<=n; k++)
                    if(Judge(a1,A[i],A[k]))
                        h+=(1<<(k-1));
                B[++n1]=h;
            }
            B[++n1]=1<<(i-1);
        }
        memset(dp,63,sizeof dp);
        dp[0]=0;
        for(int i=0; i<(1<<n); i++)
            for(int j=1; j<=n1; j++)
                Min(dp[i|B[j]],dp[i]+1);
        printf("%d\n",dp[(1<<n)-1]);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章