• ZOJ Bookcase


    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3523

    ZOJ 求使无序的序列变有序的最小花费, LIS, struct 初始化需要特别注意

    View Code
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <algorithm>
    
    int f_min(int x,int y) {if(x<y)return x;else return y;}
    int f_max(int x,int y) {if(x>y)return x;else return y;}
    int f_abs(int x) {return x>0?(x):(-x);}
    using namespace std;
    
    const int MM = 555555;
    int N, M;
    int head[MM], NE;
    int f[MM], d[MM];
    bool visx[MM], visy[MM];
    struct Edge{
        int v,w,next;
    }edge[MM<<2];
    
    void reset(int n) {
        NE = 0;
        memset(head,-1,sizeof(head));
        memset(visx,false,sizeof(visx));
        memset(visy,false,sizeof(visy));
    }
    void add_edge(int u,int v,int w) {
        edge[NE].v=v, edge[NE].w=w;
        edge[NE].next=head[u], head[u]=NE++;
    }
    struct Pos{
        char str[100];
        int  aci[100];
        int len;
        int id;
        void reset() {id=len=0; memset(aci,0,sizeof(aci));}
    }g[55][55];
    char last[100][100];
    
    void tran() {
        int i,j,k;
        for(i=0;i<N;i++) {
            for(j=0;j<M;j++) {
                for(k=0;k<g[i][j].len;k++) {
                    printf("%d ",g[i][j].aci[k]);
                }
                printf("\n");
            }
        }
    }
    void get_data() {
        int i,j,k,a,b,c;
        for(i=0;i<N;i++) {
            for(j=0;j<M;j++) g[i][j].reset();
        }
        getchar();
        for(i=0;i<N;i++) {
            for(j=0;j<M;j++) {
                gets(g[i][j].str);
                g[i][j].len=strlen(g[i][j].str);
                for(k=0;k<g[i][j].len;k++) g[i][j].aci[k]=g[i][j].str[k];
            }
        }
    //    tran();
    }
    int ok(int*A,int Alen,int*B,int Blen) {
        int len=f_max(Alen,Blen);
        for(int i=0;i<len;i++) {
            if(A[i]<B[i]) return 2;
            if(A[i]>B[i]) return 3;
        }
        return 1;
    }
    int bsearch(int&a,int size) {
        int l=0, r=size-1;
        while(l<=r) {
            int mid=(l+r)>>1;
            if(a>=f[mid-1] && a<f[mid]) return mid;
            else if(a<f[mid]) r=mid-1;
            else l=mid+1;
        }
        return -1;
    }
    int LIS(int p) {
        int i,j,size=1;
        f[0]=g[p][0].id; d[0]=1;
        for(i=1;i<M;i++) {
            if(g[p][i].id<f[0]) j=0;
            else if(g[p][i].id>=f[size-1]) j=size++;
            else j=bsearch(g[p][i].id,size);
            if(j>=0) f[j]=g[p][i].id; d[i]=j+1;
        }
        return size;
    }
    void solve() {
        int i,j,k, ans=0, tmp;
        for(i=0;i<N;i++) {
            for(j=0;j<M;j++) {
                for(k=0;k<M;k++) {
                    tmp=ok(g[i][j].aci,g[i][j].len,g[i][k].aci,g[i][k].len);
                    if(tmp==3) g[i][j].id++;
                }
    //            printf("%d %d %d\n",i,j,g[i][j].id);
            }
        }
        for(i=0;i<N;i++) {
            ans+=(M-LIS(i));
    //        printf("%d\n",ans);
        }
        printf("%d\n",ans);
    }
    int main() {
        while(scanf("%d%d",&N,&M)!=EOF) get_data(),solve();
        return 0;
    }
  • 相关阅读:
    Freefilesync-文件夹自动同步
    考研打卡_Day077
    考研打卡_Day076
    考研打卡_Day075
    考研打卡_Day074
    考研打卡_Day073
    考研打卡_Day072
    考研打卡_Day071
    考研打卡_Day070
    考研打卡_Day069
  • 原文地址:https://www.cnblogs.com/zhang1107/p/2979413.html
Copyright © 2020-2023  润新知