zoukankan      html  css  js  c++  java
  • Codeforces Round #277 (Div. 2 Only)

    A:SwapSort

    http://codeforces.com/problemset/problem/489/A

    题目大意:将一个序列排序,可以交换任意两个数字,但要求交换的次数不超过n,输出任意一种方案即可

    思路:真心想复杂了,排个序,然后按顺序把每个数交换到它应该在的地方即可

    #include <stdio.h>

    #include <algorithm>

    #define maxn 40000

    using namespace std;

    struct T{int x;int y;}a[maxn];

    int cmp(T a,T b){return a.x<b.x;}int b[maxn];

    int main()

    {

        int n;

        scanf("%d",&n);

        for(int i=1;i<=n;i++)scanf("%d",&a[i].x),a[i].y=i;

        sort(a+1,a+1+n,cmp);

        for(int i=1;i<=n;i++)b[a[i].y]=i;

        printf("%d ",n);

        for(int i=1;i<=n;i++)

            for(int j=1;j<=n;j++)if(b[j]==i)

            {

                printf("%d %d ",i-1,j-1);

                int t=b[j];b[j]=b[i];b[i]=t;break;

            }

        return 0;

    }

    B:BerSU Ball

    http://codeforces.com/problemset/problem/489/B

    题目大意:n个男孩m个女孩配对,要求男女的身高差不能1,问最多能有几对配对

    思路:裸的二分匹配

    #include <stdio.h>

    #include <string.h>

    #define maxn 40000

    using namespace std;

    int head[maxn],point[maxn],next[maxn],now,match[maxn],a[maxn],b[maxn];

    bool visit[maxn];

    void add(int x,int y){next[++now]=head[x];head[x]=now;point[now]=y;}

    int dfs(int k){

        for(int i=head[k];i;i=next[i]){

            int u=point[i];

            if(visit[u]==0){

                visit[u]=1;

                if(match[u]==-1 || dfs(match[u])){match[u]=k;return 1;}

            }

        }

        return 0;

    }

    int main(){

        int n,m,ans=0;

        scanf("%d",&n);

        for(int i=1;i<=n;i++)scanf("%d",&a[i]);

        scanf("%d",&m);

        for(int i=1;i<=m;i++){

            scanf("%d",&b[i]);

            for(int j=1;j<=n;j++)

                if((abs(a[j]-b[i])<=1))add(i,j);

        }

        memset(match,-1,sizeof(match));

        for(int i=1;i<=m;i++){

            memset(visit,0,sizeof(visit));if(dfs(i))ans++;

        }

        printf("%d ",ans);

        return 0;

    }

    C:C. Given Length and Sum of Digits...

    http://codeforces.com/problemset/problem/489/C

    题目大意:给出m和s,要求满足长度为m,各位和相加等于s的十进制的最小和最大的数

    思路:小数据自己看一下随便搞一下就可以了 注意2 18/ 3 18之类的数据即可AC

    #include <stdio.h>

    #include <string.h>

    #include <algorithm>

    #define maxn 40000

    using namespace std;int main(){

    int m,s;
        scanf("%d%d",&m,&s);
        if(m==1&&s==0){printf("%d %d
    ",0,0);return 0;}
        int v=s%9,u=s/9,l=u+(v==0?0:1);
        if(l>m||(s==0&&m>1)){printf("-1 -1
    ");return 0;}
        if(v!=0){
            if(l==m){printf("%d",v);
            for(int i=1;i<=u;i++)printf("9");printf(" ");
            for(int i=1;i<=u;i++)printf("9");printf("%d",v);
            for(int i=1;i<=m-1-u;i++)printf("0");printf("
    ");
            }else{
                printf("1");v--;
                for(int i=1;i<=m-u-2;i++)printf("0");printf("%d",v);
                for(int i=1;i<=u;i++)printf("9");printf(" ");v++;
                for(int i=1;i<=u;i++)printf("9");printf("%d",v);
                for(int i=1;i<=m-1-u;i++)printf("0");printf("
    ");
            }
        }
        else if(l==m){
            for(int i=1;i<=m;i++)printf("9");printf(" ");
            for(int i=1;i<=m;i++)printf("9");
        }
        else
        {
            printf("1");
            for(int i=1;i<=m-u-1;i++)printf("0");printf("8");
            for(int i=1;i<=u-1;i++)printf("9");printf(" ");
            for(int i=1;i<=u;i++)printf("9");for(int i=1;i<=m-u;i++)printf("0");
            printf("
    ");
        }

       return 0;

    }

    D:Unbearable Controversy of Being

    http://codeforces.com/problemset/problem/489/D

    题目大意:给出一个有向图,求图中存在多少个“"damn rhombus"”结构,一个“"damn rhombus"”定义为图中的菱形,即a到d同时有a->b->d的路径和a->c->d的路径

    思路:还以为神题,打个暴力就过了,具体做法的话枚举每个点为起点,记录走两步路到达每个点的次数v[i],然后求一下ΣC(2,v[i])就是该点为起点的"damn rhombus"的个数

    #include <stdio.h>

    #include <string.h>

    #define maxn 60009

    using namespace std;

    int head[maxn],point[maxn],next[maxn],now,vv[maxn];

    bool visit[maxn];int a[maxn],b[maxn];void add(int x,int y){
        next[++now]=head[x];
        head[x]=now;
        point[now]=y;}void dfs(int k){
        visit[k]=1;
        for(int i=head[k];i;i=next[i])
        {
            int u=point[i];
            visit[u]=1;
            for(int j=head[u];j;j=next[j])if(!visit[point[j]])
            {
                int v=point[j];
                vv[v]++;
            }
            visit[u]=0;
        }
        visit[k]=0;}int main(){
        int n,m,x,y;
        long long an=0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            scanf("%d%d",&x,&y);add(x,y);
        }
        for(int i=1;i<=n;i++)
        {
            dfs(i);
            for(int j=1;j<=n;j++)
            {
                an+=(vv[j]*(vv[j]-1))>>1;
                vv[j]=0;
            }
        }
        printf("%I64d
    ",an);

    return 0;

    }

    E: Hiking

    http://codeforces.com/problemset/problem/489/E

    题目大意:一维的x轴,上面有n个可供晚上休息的地点,一个人从0号点走到n号点,选择一些点Xi休息,他每天希望走l公里,所以他的失望程度等于Σsqrt(Xi-X(i-1)-l)/Σbi  在使失望程度最小的前提下他应该选择哪些点?

    思路:一开始直接DP分子分母,然后发现不满足无后效性,喵了一眼标签确定是二分后才想到是01分数规划问题,二分最小值,我们接下来就是要让Σsqrt(Xi-X(i-1)-l)-k*bi最小,然后判断正负即可

    #include <stdio.h>

    #include <string.h>

    #include <algorithm>

    #include <math.h>

    #include <iostream>

    #define maxn 40000

    #define esp 0.00000001

    using namespace std;

    int x[maxn],b[maxn],last[maxn],ans[maxn],n,l,h=0;

    double dp[maxn];

    double min(double x,double y){return x<y?x:y;}

    int judge(double k)

    {

        for(int i=1;i<=n;i++)

        {

            dp[i]=0x3f3f3f3f;

            for(int j=0;j<i;j++){

                double u=dp[j]+sqrt(abs(x[i]-x[j]-l))-k*b[i];

                if(u<dp[i])dp[i]=u,last[i]=j;

            }

        }if(dp[n]>=0)return 1;else return 0;

    }

    int main()

    {

        scanf("%d%d",&n,&l);

        for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&b[i]);

        double l=0,r=1e5+1;

        while(r-l>esp)

        {

            memset(last,-1,sizeof(last));

            double mid=(l+r)/2;

            if(judge(mid))l=mid;else r=mid;

        }

        int idx=n;

        while(last[idx]!=-1)ans[++h]=idx,idx=last[idx];

        for(int i=h;i>=1;i--)printf("%d ",ans[i]);

        return 0;

    }

  • 相关阅读:
    数据库事务的四大特性
    Mysql数据库的慢sql优化步骤
    数据库事务的4大隔离级别
    mysql的命令练习
    通过jedis对redis客户端的一些基本操作
    通过jedisPool写一个redis连接池
    jedis
    maven将本地jar包添加到本地仓库
    [Django学习] Django基础(7)_分类统计
    [Django学习] Django基础(6)_Field lookups
  • 原文地址:https://www.cnblogs.com/philippica/p/4105473.html
Copyright © 2011-2022 走看看