NOIP2016 Day2

来源:互联网 发布:网易云音乐推荐算法 编辑:程序博客网 时间:2024/06/15 12:33

T1

杨辉三角算组合数+二维前缀和
水爆
分值:100

CODE

#include<cstdio>#define N 2005int 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 7100005using 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;}
原创粉丝点击