zoukankan      html  css  js  c++  java
  • [20180528]校内模拟赛

    T1:AtCoder 2069

    很简单的最短路呀,可是好像很多同学WA了很多次。

    #include<bits/stdc++.h>
    using namespace std;
    inline int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return x*f;
    }
    #define MN 100005
    #define inf 200000000
    int n,m,d[MN];
    struct edge{
        int to,c,nex;
    }e[MN*4];int hr[MN],cnt;
    inline void ins(int f,int t,int c){
        e[++cnt]=(edge){t,c,hr[f]};hr[f]=cnt;
    }
    int q[MN*40],top;
    bool inq[MN];
    set<int> col[MN];
    inline void sp(){
        register int i,j;
        for(i=1;i<=n;i++) d[i]=inf;
        inq[1]=1;
        for(d[q[top=i=1]=1]=0;i<=top;inq[q[i++]]=false)
        for(j=hr[q[i]];j;j=e[j].nex){
            bool t=col[q[i]].find(e[j].c)==col[q[i]].end();
            if(d[e[j].to]>d[q[i]]+t){
                if(!inq[e[j].to]) inq[e[j].to]=1,q[++top]=e[j].to;
                col[e[j].to].clear(),col[e[j].to].insert(e[j].c);
                d[e[j].to]=d[q[i]]+t;
            }
            else if(d[e[j].to]==d[q[i]]+t&&col[e[j].to].find(e[j].c)==col[e[j].to].end()){
                if(!inq[e[j].to]) inq[e[j].to]=1,q[++top]=e[j].to;
                col[e[j].to].insert(e[j].c);
            }
        }
    }
    int main(){
        n=read(),m=read();
        register int i,a,b,c;
        for(i=1;i<=m;i++)
        a=read(),b=read(),c=read(),ins(a,b,c),ins(b,a,c);
        sp();printf(d[n]==inf?"-1":"%d
    ",d[n]);
        return 0;
    }

    T2:Atcoder 2656

    人生第一次做交互题,很有思路的样子?但是就是WA了很多次,至今也不知道之前到底错在哪了,只好照着学长讲的又打了一遍。

    #include<bits/stdc++.h>
    using namespace std;
    inline int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return x*f;
    }
    #define mid (l+r>>1)
    int a[15],dig;
    char c[14];
    long long ans,digi[15];
    bool check(long long x){
        printf("? %lld
    ",x);
        fflush(stdout);
        scanf("%s",c);
        if(c[0]=='Y') return 1;
        return 0;
    }
    main(){
        digi[0]=1;dig=1;
        for(int i=1;i<=9;i++){
            digi[i]=digi[i-1]*10;
            printf("? %lld
    ",digi[i]);
            fflush(stdout);
            scanf("%s",c);
            if(c[0]=='N') break;
            dig++;
        }
        if(dig==10){
            int len;
            for(len=0;len<9;++len){
                printf("? %lld
    ",digi[len+1]-1);
                fflush(stdout);
                scanf("%s",c);
                if(c[0]=='Y') break;
            }
            printf("! %lld
    ",digi[len]);
            fflush(stdout);return 0;
        }
        for(int i=1;i<=dig;++i){
            int l=i==1,r=9;
            while(l<r){
                if(check((ans+mid*digi[dig-i])*10+digi[dig-i+1]-1)) r=mid;
                else l=mid+1;
            }
            ans+=l*digi[dig-i];
        }
        printf("! %lld
    ",ans);
        fflush(stdout);
        return 0;
    }

    T3:Atcoder 3673

    首先f[i]表示填到第i这个位置,最少的Hamming distanc,然后很简单转移一下吧。(num是0的前缀数组)

    1.f[i]=min(f[i],f[i-1]+a[i]) 无所作为

    2.f[v[i][j]]=min(f[v[i][j]],f[i]+num[v[i][j]]-num[i],query(i,v[i][j])+num[v[i][j]])

                                      表示填了这个区间    不填,找到和【i,v[i][j]】相交的区间,找到最优的转移方法(可以用线段树查区间最小,存f[i]-num[i]的值)

    好像也不难的样子,可是太弱了,好久才听懂。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    using namespace std;
    inline int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return x*f;
    }
    #define MN 200005
    #define N 262144
    int n,m,num[MN],f[MN],t[N*2+5],a[MN];
    vector<int> v[MN];
    inline void rw(int x,int v){for(x+=N+1;t[x]=min(t[x],v),x>>=1;);}
    inline int query(int l,int r){
        int res=1e9;
        for(l+=N,r+=N+2;l^r^1;l>>=1,r>>=1){
            if(~l&1) res=min(res,t[l+1]);
            if( r&1) res=min(res,t[r-1]);
        }
        return res;
    }
    int main(){
        n=read();register int i,j;
        for(i=1;i<=n;++i) num[i]=num[i-1]+1-(a[i]=read()),f[i]=1e9;
        m=read();memset(t,63,sizeof t);int l;
        for(i=1;i<=m;++i) l=read(),v[l-1].push_back(read());
        for(i=0;i<n;++i){
            f[i+1]=min(f[i+1],f[i]+a[i+1]);
            for(j=0;j<v[i].size();++j){
                int w=min(f[i]+num[v[i][j]]-num[i],query(i,v[i][j])+num[v[i][j]]);
                f[v[i][j]]=min(f[v[i][j]],w);
                rw(v[i][j],w-num[v[i][j]]); 
            }
        }
        printf("%d
    ",f[n]);
    }

    来自PaperCloud的博客,未经允许,请勿转载,TKS!

  • 相关阅读:
    《数据挖掘系统支撑下的高考志愿填报在线咨询系统设计与实现》论文笔记(十二)
    《基于本体的高考志愿填报辅助系统的设计与实现》论文笔记(十一)
    20189312任方园《网络攻防》第十次作业
    20189312任方园《网络攻防》第九次作业
    20189312任方园《网络攻防》第八次作业
    20189312任方园《网络攻防》第七次作业
    20189312任方园《网络攻防》第六次作业
    20189312任方园《网络攻防》第五次作业
    20189312任方园《网络攻防》第四次作业
    20189312任方园《网络攻防》第三次作业
  • 原文地址:https://www.cnblogs.com/PaperCloud/p/9108272.html
Copyright © 2011-2022 走看看