zoukankan      html  css  js  c++  java
  • 2013 成都网络赛 1003 1004 1007 1008 1010

    思路:

    1003是大水题

    #include<set>
    #include<map>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pb push_back
    #define mp make_pair
    #define Maxn 100010
    #define Maxm 200010
    #define LL __int64
    #define Abs(x) ((x)>0?(x):(-x))
    #define lson(x) (x<<1)
    #define rson(x) (x<<1|1)
    #define inf 100000
    #define lowbit(x) (x&(-x))
    #define clr(x,y) memset(x,y,sizeof(x))
    #define Mod 1000000007
    using namespace std;
    char ss[20]="nanodesu";
    int main()
    {
        int t,i,j,l;
        int Case=0;
        char str[110];
        scanf("%d",&t);
        while(t--){
            scanf("%s",&str);
            l=strlen(str);
            printf("Case #%d: ",++Case);
            if(l>=4&&str[l-1]=='u'&&str[l-2]=='s'&&str[l-3]=='e'&&str[l-4]=='d'){
                str[l-4]='';
                printf("%s",str);
                printf("%s
    ",ss);
                continue;
            }
            printf("%s",str);
            printf("%s
    ",ss);
        }
        return 0;
    }
    View Code

    1004贪心

    #include<set>
    #include<map>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pb push_back
    #define mp make_pair
    #define Maxn 100010
    #define Maxm 200010
    #define LL __int64
    #define Abs(x) ((x)>0?(x):(-x))
    #define lson(x) (x<<1)
    #define rson(x) (x<<1|1)
    #define inf 100000
    #define lowbit(x) (x&(-x))
    #define clr(x,y) memset(x,y,sizeof(x))
    #define Mod 1000000007
    using namespace std;
    int main()
    {
        int i,n,m,t,Case=1;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&m,&n);
            printf("Case #%d: ",Case++);
            if(m==1)
            {
                for(i=0;i<n;i++)
                    printf("a");
                printf("
    ");
            }
            else if(m>=3)
            {
                int l=n/3;
                for(i=0;i<l;i++)
                    printf("abc");
                if(n%3==1)
                    printf("a");
                else if(n%3==2)
                    printf("ab");
                printf("
    ");
            }
            else if(n==1)
             printf("a
    ");
            else if(n==2)
             printf("ab
    ");
            else if(n==3)
             printf("aab
    ");
            else if(n==4)
             printf("aabb
    ");
            else if(n==5)
             printf("aaaba
    ");
            else if(n==6)
             printf("aaabab
    ");
            else if(n==7)
             printf("aaababb
    ");
            else if(n==8)
             printf("aaababbb
    ");
            else
            {
                int r=(n-2)%6;
                int w=(n-2)/6;
                printf("aa");
                for(i=0;i<w;i++)
                    printf("aababb");
                if(r<=4)
                {
                    for(i=0;i<r;i++)
                        printf("a");
                }
                if(r==5)
                    printf("aaaab");
                printf("
    ");
            }
        }
        return 0;
    }
    View Code

    1007 动态规划

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    char x[11],y[11];
    int map[5000][11];
    int c1,c2;
    int w[]={1,2,4,8,16,32,64,128,256,512};
    int jisuan(int a,int b)
    {
        if(b<0) return 0;
        if(a==0) return 1;
        if(map[b][a]>=0) return map[b][a];
        if(a==1)
        {map[b][a]=(10<=b?10:b+1);return map[b][a];}
    
        int j,num=0;
        for(j=0;j<=9;j++)
            num+=jisuan(a-1,b-j*w[a-1]);
        map[b][a]=num;
        return num;
    }
    int main()
    {
        int i,j,n;
        scanf("%d",&n);
        memset(map,-1,sizeof(map));
        for(j=1;j<=n;j++)
        {
            scanf("%s%s",&x,&y);
            c1=strlen(x);c2=strlen(y);
            int zs=0;
            for(i=0;i<c1;i++)
                zs+=(x[i]-'0')*w[c1-i-1];
            int t=0,num=0;
            while(t<c2)
            {
                if(t==c2-1)
                {
                    if(zs>=0)
                    num+=(zs-(y[t]-'0')>=0 ? y[t]-'0'+1 : zs+1);
                    break;
                }
                for(i=0;i<=y[t]-'0';i++)
                {
                    if(i==(y[t]-'0'))
                    {
                        zs-=i*w[c2-t-1];
                        break;
                    }
                    num+=jisuan(c2-t-1,zs-i*w[c2-t-1]);
                }
                t++;
            }
            printf("Case #%d: %d
    ",j,num);
        }
        return 0;
    }
    View Code

    1008 DLX 加个剪枝就行

    #include<set>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pb push_back
    #define mp make_pair
    #define Maxn 60
    #define Maxm 80002
    #define LL __int64
    #define Abs(x) ((x)>0?(x):(-x))
    #define lson(x) (x<<1)
    #define rson(x) (x<<1|1)
    #define inf 1000000
    #define lowbit(x) (x&(-x))
    #define clr(x,y) memset(x,y,sizeof(x))
    #define Mod 1000000007
    using namespace std;
    int D[Maxn*Maxn],U[Maxn*Maxn],L[Maxn*Maxn],R[Maxn*Maxn],S[Maxn*Maxn],C[Maxn*Maxn],H[Maxn],X[Maxn*Maxn],Q[Maxn*Maxn],id,d,n,K,cnt,f,ans;
    int dis[60][60],ty[60];
    bool vi[Maxn];
    void init(int m)
    {
        int i;
        for(i=0;i<=m;i++){
            D[i]=U[i]=i;
            L[i+1]=i;
            R[i]=i+1;
            S[i]=0;
        }
        R[m]=0;
        id=m+1;
    }
    void ins(int r, int c)
    {
        U[id] = c;
        D[id] = D[c];
        U[D[c]] = id;
        D[c] = id;
        if (H[r] < 0)
            H[r] = L[id] = R[id] = id;
        else
        {
            L[id] = H[r];
            R[id] = R[H[r]];
            L[R[H[r]]] = id;
            R[H[r]] = id;
        }
        S[c]++;
        X[id]=r;
        C[id++] = c;
    }
    void Remove(int c)
    {
        int i;
        for(i=D[c];i!=c;i=D[i]){
            L[R[i]]=L[i];
            R[L[i]]=R[i];
        }
    }
    void Resume(int c)
    {
        int i;
        for(i=D[c];i!=c;i=D[i]){
            L[R[i]]=i;
            R[L[i]]=i;
        }
    }
    int A()
    {
        int i,j,k,ret=0;
        memset(vi,false,sizeof(vi));
        for(i=R[0];i;i=R[i]) if(!vi[i]){
            ret++;
            for(j=D[i];j!=i;j=D[j]){
                for(k=R[j];k!=j;k=R[k])
                    vi[C[k]]=true;
            }
        }
        return ret;
    }
    void dfs(int step)
    {
        if(step+A()>K) return ;
        int nn=0;
        int i,j,temp,c;
        for(i=0;i<step;i++){
            nn+=ty[X[Q[i]]];
        }
        if(step-nn>=ans){
            return ;
        }
        if(R[0]==0) {
            f=1;
            nn=0;
            for(i=0;i<step;i++){
                nn+=ty[X[Q[i]]];
            }
            ans=min(ans,step-nn);
            return ;
        }
        temp=inf;
        for(i=R[0];i;i=R[i]) if(S[i]<temp){
            temp=S[i];
            c=i;
        }
        for(i=D[c];i!=c;i=D[i]){
            Q[step]=i;
            Remove(i);
            for(j=R[i];j!=i;j=R[j]){
                Remove(j);
            }
            dfs(step+1);
            for(j=R[i];j!=i;j=R[j])
                Resume(j);
            Resume(i);
        }
        return ;
    }
    void floyd()
    {
        int i,j,k;
        for(k=1;k<=n;k++){
            for(i=1;i<=n;i++){
                for(j=1;j<=n;j++){
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
                }
            }
        }
    }
    void build()
    {
        int i,j,k;
        init(n);
        for(i=1;i<=n;i++){
            H[i]=-1;
            for(j=1;j<=n;j++){
                if(dis[i][j]<=d){
                    ins(i,j);
                }
            }
        }
    }
    int main()
    {
        int t,i,j,u,v,val,Case=0;
        scanf("%d",&t);
        while(t--){
            clr(dis,63);
            K=0;
            scanf("%d%d",&n,&d);
            for(i=1;i<=n;i++){
                scanf("%d",ty+i);
                K+=ty[i];
                dis[i][i]=0;
            }
            for(i=1;i<n;i++){
                scanf("%d%d%d",&u,&v,&val);
                dis[u][v]=dis[v][u]=val;
            }
            floyd();
            build();
            f=0;
            ans=inf;
            dfs(0);
            printf("Case #%d: ",++Case);
            if(!f){
                printf("-1
    ");
                continue;
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code

    1010 单调队列

    #include<set>
    #include<map>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pb push_back
    #define mp make_pair
    #define Maxn 200010
    #define Maxm 200010
    #define LL __int64
    #define Abs(x) ((x)>0?(x):(-x))
    #define lson(x) (x<<1)
    #define rson(x) (x<<1|1)
    #define inf 100000
    #define lowbit(x) (x&(-x))
    #define clr(x,y) memset(x,y,sizeof(x))
    #define Mod 1000000007
    using namespace std;
    int cnt[40],num[Maxn];
    int que[Maxn];
    int getnum(int val,int c)
    {
        int temp=val,cc=0;
        int sum=0;
        while(val){
            if(val%2) cnt[cc]+=c;
            val>>=1;
            cc++;
        }
        for(int i=0;i<=30;i++)
        if(cnt[i]){
            sum+=(1<<i);
        }
        return sum;
    }
    int main()
    {
        int t,n,m,i,j,Case=0;
        scanf("%d",&t);
        while(t--){
            scanf("%d%d",&n,&m);
            for(i=1;i<=n;i++){
                scanf("%d",num+i);
            }
            clr(cnt,0);
            int head=0,rear=0;
            int temp;
            LL ans=0;
            for(i=1;i<=n;i++){
                temp=getnum(num[i],1);
                que[rear++]=i;
                while(rear>=head&&temp>=m){
                    temp=getnum(num[que[head]],-1);
                    head++;
                }
                ans+=(LL)rear-head;
            }
            printf("Case #%d: %I64d
    ",++Case,ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    hdu 4027 Can you answer these queries? 线段树
    ZOJ1610 Count the Colors 线段树
    poj 2528 Mayor's posters 离散化 线段树
    hdu 1599 find the mincost route floyd求最小环
    POJ 2686 Traveling by Stagecoach 状压DP
    POJ 1990 MooFest 树状数组
    POJ 2955 Brackets 区间DP
    lightoj 1422 Halloween Costumes 区间DP
    模板 有源汇上下界最小流 loj117
    模板 有源汇上下界最大流 loj116
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3321641.html
Copyright © 2011-2022 走看看