zoukankan      html  css  js  c++  java
  • 【2017】

    D1T2 时间复杂度(模拟)

    难点在于1.保持耐心 2.模拟题一定要在草稿纸上考虑各种情况&处理后打代码 3.多造几组卡/特殊的数据测试

    #include<bits/stdc++.h>
    #define ri register int
    #define ll long long
    #define For(i,l,r) for(ri i=l;i<=r;i++)
    #define Dfor(i,r,l) for(ri i=r;i>=l;i--)
    using namespace std;
    string a,b;
    int sen,com,cir,use[27],g[27],plex,go,ad[100],maxx,n,o;
    inline ll read(){
        ll f=1,sum=0;
        char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)){sum=(sum<<1)+(sum<<3)+(ch^48);ch=getchar();}
        return f*sum;
    }
    int main(){
        o=read();
        while(o>0){
            sen=com=cir=plex=go=maxx=n=0;o--;
            memset(use,0,sizeof(use)),memset(ad,0,sizeof(ad));
            while(b[0]!='O'){
                a=b;cin>>b;
            }
            for(int i=0;i<a.length();i++) sen=sen*10+a[i]-'0';
            for(int i=4;i<b.length()-1;i++) com=com*10+b[i]-'0'; 
            while(sen>0){
                sen--;cin>>a;
                if(a[0]=='F'){
                    cir++;cin>>a;
                    if(use[a[0]-96]) cir=-1;
                    else use[a[0]-96]=1,g[cir]=a[0]-96;
                    cin>>a>>b;
                    if(a[0]!='n'&&b[0]=='n'&&go==0) plex++,ad[cir]=1;
                    else if(((a.length()==b.length()&&a>b)||(a.length()>b.length())||(a[0]=='n'&&b[0]!='n'))&&go==0) go=1,n=cir;
                }
                else{
                    maxx=max(maxx,plex);use[g[cir]]=0;
                    if(ad[cir]==1) plex--,ad[cir]=0;
                    cir--;
                    if(n>0&&cir<n) go=n=0;
                }
                if(cir==-1) printf("ERR
    "),sen=-1;
            }
            if(cir>0) printf("ERR
    ");
            if(cir==0&&maxx==com) printf("Yes
    ");
            if(cir==0&&maxx!=com) printf("No
    ");    
        }
        return 0;
    }
    View Code

    D1T3逛公园()

     D2T2 宝藏(DFS+剪枝)

    40分的暴力分只要稳很好拿,注意自己造数据多测验。

    看到n的范围这么小,大部分都会想到状压DP,但其实DFS+剪枝就可以非常快地跑过这道题,所以后期复习一定要注意基础算法的彻底理解与各种应用,比如这道题利用的是DFS求全排列的一种思想,并非常见的DFS操作。

    正确性在于题面所给,“小明不想开发无用道路,即两个已经被挖掘过的宝藏 屋之间的道路无需再开发。”。

    70分代码如下:

    #include<bits/stdc++.h>
    #define ri register int
    #define ll long long
    #define For(i,l,r) for(ri i=l;i<=r;i++)
    #define Dfor(i,r,l) for(ri i=r;i>=l;i--)
    using namespace std;
    const int M=20;
    int a[M],l[M],cost[M][M],ans=2e9,tmp,m,n;
    inline ll read(){
        ll f=1,sum=0;
        char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)){sum=(sum<<1)+(sum<<3)+(ch^48);ch=getchar();}
        return f*sum;
    }
    inline void dfs(int x,int num){
        if(num==n){
            ans=min(tmp, ans);
            return;
        }
        if(tmp>=ans) return;
        For(i,1,n){
            if(l[i]) continue;
            For(j,1,n){
                if(cost[i][j]==2e9||!l[j]||i==j) continue;
                tmp+=l[j]*cost[j][i];l[i]=l[j]+1;
                dfs(i,num+1);
                tmp-=l[j]*cost[j][i];l[i]=0;
            }
        }
    }
    int main() {
        n=read(),m=read();
        For(i,1,n){
            For(j,1,n){
                cost[i][j]=2e9;
            }
        }
        For(i,1,m){
            int u=read(),v=read(),w=read();
            cost[u][v]=cost[v][u]=min(cost[u][v],w);
        }
        For(i,1,n){
            l[i]=1;dfs(i,1);l[i]=0;
        }
        printf("%lld
    ",ans);
        return 0;
    }
    View Code

    AC代码如下:

    #include<bits/stdc++.h>
    #define For(i,l,r) for(int i=l;i<=r;i++)
    using namespace std;
    const int M=20;
    int n,m,c[M][M],d[M],du[M][M],tmp,p,vis[M],lev[M],cnt,tot,ans=2e9;
    inline int read(){
        int f=1,sum=0;
        char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)){sum=(sum<<1)+(sum<<3)+(ch^48);ch=getchar();}
        return f*sum;
    }
    inline bool cmp(int a,int b){return c[p][a]<c[p][b];}
    inline void dfs(int x,int y){
        For(i,x,cnt){
            if(tot+tmp*lev[vis[i]]>=ans) return;
            For(j,y,d[vis[i]]){
                if(!lev[du[vis[i]][j]]){
                    cnt++;
                    vis[cnt]=du[vis[i]][j];
                    tmp-=c[vis[cnt]][du[vis[cnt]][1]];
                    tot+=c[vis[i]][vis[cnt]]*lev[vis[i]];
                    lev[vis[cnt]]=lev[vis[i]]+1;
                    dfs(i,j+1);
                    tot-=c[vis[i]][vis[cnt]]*lev[vis[i]];
                    lev[vis[cnt]]=0;
                    tmp+=c[vis[cnt]][du[vis[cnt]][1]];
                    cnt--;
                }
            }
            y=1;
        }
        if(cnt==n){
            if(tot<ans) ans=tot;
            return;
        }
    }
    int main(){
        n=read(),m=read();
        For(i,1,n){
            For(j,1,n){
                c[i][j]=2e9;
            }
        }
        For(i,1,m){
            int u=read(),v=read(),w=read();
            if(c[u][v]<w) continue;
            if(c[u][v]==2e9) du[u][++d[u]]=v,du[v][++d[v]]=u;
            c[u][v]=c[v][u]=w;
        }
        For(i,1,n){
            p=i;
            sort(du[i]+1,du[i]+d[i]+1,cmp);
            tmp+=c[i][du[i][1]];
        }
        For(i,1,n){
            tot=0,cnt=1;
            vis[1]=i;
            tmp-=c[i][du[i][1]];
            lev[i]=1;
            dfs(1,1);
            lev[i]=0;
            tmp+=c[i][du[i][1]];
        }
        printf("%d
    ",ans);
        return 0;
    } 
    /*
    8 7
    1 2 3
    2 3 3
    3 4 3
    4 5 3
    5 6 3
    6 7 3
    7 8 3
    */
    View Code
  • 相关阅读:
    以服务形式运行SVN(svnserve)
    快速切换公司双线网络的批处理文件
    提高ASP.Net应用程序性能的十大方法
    NoSQL数据库探讨之一 - 为什么要用非关系数据库?
    快速实现一个简单的bigpipe模型
    Visual Studio使用小技巧1 – HTML编辑器中的格式化 (转载)
    Visual Studio使用小技巧2 – 使用任务列表(task list) (转载)
    Visual Studio 快捷键
    网站开发人员应该知道的62件事(转载)
    Visual Studio使用小技巧5 – 区块选择(box selection)的拷贝(copy)和粘贴(paste) (转载)
  • 原文地址:https://www.cnblogs.com/jian-song/p/11853505.html
Copyright © 2011-2022 走看看