zoukankan      html  css  js  c++  java
  • 2017-11-8 NOIP模拟赛

    1.足球联赛

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n;
    struct node{
        int sc,id;
    }a[51];
    char s[51][51];
    bool cmp(node x,node y){
        if(x.sc!=y.sc)return x.sc>y.sc;
        return x.id<y.id;
    }
    int main(){
        freopen("soccer.in","r",stdin);freopen("soccer.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%s",s[i]+1),a[i].id=i;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i==j)continue;
                if(s[i][j]=='W')a[i].sc+=3;
                if(s[i][j]=='L')a[j].sc+=3;
                if(s[i][j]=='D')a[i].sc+=1,a[j].sc+=1;
            }
        }
        sort(a+1,a+n+1,cmp);
        int ans=a[1].sc;printf("%d ",a[1].id);
        for(int i=2;i<=n;i++){
            if(a[i].sc!=ans)return 0;
            printf("%d ",a[i].id);
        }
        return 0;
    }
    100分

    2.最短路径

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<ctime>
    #include<queue>
    #define maxn 1010
    using namespace std;
    int n,b1,b2,pre[maxn];
    double x[maxn],y[maxn],dis[maxn][maxn],d[maxn];
    double ans=1000000000000000000;
    bool vis[maxn],v[maxn];
    double Calc(double a1,double b1,double a2,double b2){
        double res;
        res=sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));
        return res;
    }
    void dfs(int pos,double sum){
        if(sum>=ans)return;
        if(x[pos]>x[b1]&&vis[b1]==0)return;
        if(pos==n){
            int p=n;
            for(int i=n;i>=1;i--){
                if(!vis[i]){
                    sum+=dis[i][p];
                    p=i;
                    if(sum>=ans)return;
                }
            }
            ans=min(ans,sum);
            return;
        }
        for(int i=pos+1;i<=n;i++){
            if(i==b2)continue;
            if(i==b1){
                vis[i]=1;
                dfs(i,sum+dis[pos][i]);
                vis[i]=0;
                break;
            }
            vis[i]=1;
            dfs(i,sum+dis[pos][i]);
            vis[i]=0;    
        }
    }
    
    struct node{
        double v;
        int id;
        bool operator < (const node x)const{
            return v>x.v;
        }
    };
    node make_node(double v,int id){
        node res;res.v=v;res.id=id;
        return res;
    }
    double Dij1(){
        priority_queue<node>q;
        q.push(make_node(0,1));
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)d[i]=1000000000;
        d[1]=0;
        while(!q.empty()){
            node now=q.top();q.pop();
            if(vis[now.id])continue;
            vis[now.id]=1;
            for(int i=now.id+1;i<=n;i++){
                if(i>b1)break;
                if(d[i]>d[now.id]+dis[now.id][i]){
                    d[i]=d[now.id]+dis[now.id][i];
                    q.push(make_node(d[i],i));
                    pre[i]=now.id;
                }
            }
        }
    }
    double Dij2(){
        priority_queue<node>q;
        q.push(make_node(d[b1],b1));
        vis[b1]=0;
        while(!q.empty()){
            node now=q.top();q.pop();
            if(vis[now.id])continue;
            vis[now.id]=1;
            for(int i=now.id+1;i<=n;i++){
                if(d[i]>d[now.id]+dis[now.id][i]){
                    d[i]=d[now.id]+dis[now.id][i];
                    q.push(make_node(d[i],i));
                    pre[i]=now.id;
                }
            }
        }
        double res=0;
        int now=n;
        while(now){
            v[now]=1;
            res+=dis[now][pre[now]];
            now=pre[now];
        }
        v[1]=0;
        int p=n;
        for(int i=n;i>=1;i--){
            if(!v[i]){
                res+=dis[i][p];
                p=i;
            }
        }
        return res;
    }
    
    int main(){
        freopen("paths.in","r",stdin);freopen("paths.out","w",stdout);
    //    freopen("Cola.txt","r",stdin);
        scanf("%d%d%d",&n,&b1,&b2);
        b1++;b2++;
        for(int i=1;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++){
                double d=Calc(x[i],y[i],x[j],y[j]);
                dis[i][j]=dis[j][i]=d;
            }
        if(n<=20){//爆搜 
            dfs(1,0);
            printf("%.2lf",ans);
            return 0;
        }
        else{//贪心 
            double ans1=0,ans2=0;
            memset(v,0,sizeof(v));
            Dij1();
            ans1=Dij2();
            printf("%.2lf",ans1);
        }
    }
    20分 暴力

    3.阿Q的停车场

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,m,F,x,pos[1000010],car[200010];
    bool check(int x){
        int cnt=0;
        for(int i=1;i<=n;i++){
            if(car[i]==0)cnt++;
            else cnt=0;
            if(cnt>=x)return 1;
        }
        return 0;
    }
    void Insert(int id){
        int l=0,r=1000000,mid,len=0;
        while(l<=r){
            mid=(l+r)>>1;
            if(check(mid))len=mid,l=mid+1;
            else r=mid-1;
        }
        if(len%2==0)len-=1;
        l=1,r=0;
        int Pos;
        for(int i=1;i<=n;i++){
            if(car[i]==0)r=i;
            if(car[i]>0)l=i+1;
            if(r-l+1>=len)break;
        }
        if(r==n-1&&car[n]==0)r=n;
        if(l==1){
            puts("1");
            pos[id]=1;
            car[1]=id;
            return;
        }
        else if(r==n){
            printf("%d
    ",n);
            pos[id]=n;
            car[n]=id;
            return;
        }
        Pos=l+len/2;
        pos[id]=Pos;
        car[Pos]=id;
        printf("%d
    ",Pos);
    }
    int main(){
    //    freopen("park.in","r",stdin);freopen("park.out","w",stdout);
    //    freopen("Cola.txt","r",stdin);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            scanf("%d%d",&F,&x);
            if(F==1){
                if(i==1){
                    puts("1");
                    car[1]=x;
                    pos[x]=1;
                }
                else Insert(x);
            }
            if(F==2){
                car[pos[x]]=0;
                pos[x]=0;
            }
        }
    }
    10分 暴力
  • 相关阅读:
    rs
    stm32f767 usoc3
    stm32f767 RTT 日志
    stm32f767 标准库 工程模板
    stm32f767 HAL 工程模板
    docker tab 补全 linux tab 补全
    docker anconda 依赖 下载 不了
    docker run 常用 指令
    linux scp 命令
    Dockerfile 常用参数说明
  • 原文地址:https://www.cnblogs.com/thmyl/p/7803121.html
Copyright © 2011-2022 走看看