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

    A题求给出映射的反射,水题

    #include <cstdio>
    int x,ans[105],n;
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&x);
            ans[x]=i;
        }for(int i=1;i<=n;i++)printf("%d ",ans[i]);
        return 0;
    }

    B题,三进制的减法

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int a[1000],b[1000],c[1000];
    int A,B,C,la,lb,lc;
    int main(){
        scanf("%d%d",&A,&C);
        while(A){a[la++]=A%3;A/=3;}
        while(C){c[lc++]=C%3;C/=3;}
        for(int i=0;i<la||i<lc;i++){
            if(a[i]==c[i])b[i]=0;
            if((a[i]+1)%3==c[i])b[i]=1;
            if((a[i]+2)%3==c[i])b[i]=2;
        }for(int i=max(la,lc);i>=0;i--)B=B*3+b[i];
        printf("%d
    ",B);
        return 0;
    } 

    C题题意,更改一个数字,使得数列总和最小

    #include <cstdio>
    #include <algorithm>
    using namespace std; 
    int n,a[100005];
    int main(){
        scanf("%d",&n);
        for(int i=0;i<n;i++)scanf("%d",&a[i]);
        sort(a,a+n);
        if(a[n-1]==1)a[n-1]=2;else a[n-1]=1;
        sort(a,a+n);
        for(int i=0;i<n;i++)printf("%d ",a[i]);
        return 0;
    }

    D题给出八个点,判断是否能够分成两组,使得第一组四点构成正方形,第二组四点构成矩形

    构成矩形的判断方式是,对角线长度相等,并且中点重合,构成正方形的判断方式是已构成的矩形相邻两边长度相等

    对于八个点利用状态压缩枚举每一种四个点的选择情况,判断是否满足条件即可

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    struct data{double x,y;}p[8],p1[4],p2[4];
    bool cmp(data a,data b){return a.x==b.x?a.y<b.y:a.x<b.x;}
    bool CheckSquare(){
        sort(p1,p1+4,cmp);
        double d1=(p1[3].x-p1[0].x)*(p1[3].x-p1[0].x)+(p1[3].y-p1[0].y)*(p1[3].y-p1[0].y);
        double d2=(p1[2].x-p1[1].x)*(p1[2].x-p1[1].x)+(p1[2].y-p1[1].y)*(p1[2].y-p1[1].y);
        return(d1==d2&&(p1[3].x+p1[0].x==p1[1].x+p1[2].x)&&(p1[3].y+p1[0].y==p1[1].y+p1[2].y));
    }
    bool CheckRectangle(){
        sort(p2,p2+4,cmp);
        double d1=(p2[3].x-p2[0].x)*(p2[3].x-p2[0].x)+(p2[3].y-p2[0].y)*(p2[3].y-p2[0].y);
        double d2=(p2[2].x-p2[1].x)*(p2[2].x-p2[1].x)+(p2[2].y-p2[1].y)*(p2[2].y-p2[1].y);
        double d3=(p2[2].x-p2[0].x)*(p2[2].x-p2[0].x)+(p2[2].y-p2[0].y)*(p2[2].y-p2[0].y);
        double d4=(p2[0].x-p2[1].x)*(p2[0].x-p2[1].x)+(p2[0].y-p2[1].y)*(p2[0].y-p2[1].y);
        return(d1==d2&&d3==d4&&(p2[3].x+p2[0].x==p2[1].x+p2[2].x)&&(p2[3].y+p2[0].y==p2[1].y+p2[2].y));
    }
    int main(){
        for(int i=0;i<8;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
        for(int i=0;i<256;i++){
            int tmp=i,cnt=0;
            for(int j=0;j<8;j++)if((1<<j)&i)cnt++;
            if(cnt!=4)continue; cnt=0;int cnt0=0;
            for(int j=0;j<8;j++){
                if((1<<j)&i)p1[cnt++]=p[j];
                else p2[cnt0++]=p[j];
            }
            if(CheckSquare()&&CheckRectangle()){
                puts("YES");
                for(int j=0;j<8;j++)if(!((1<<j)&i))printf("%d ",j+1);puts("");
                for(int j=0;j<8;j++)if(((1<<j)&i))printf("%d ",j+1);puts("");
                return 0;
            }
        }puts("NO");
        return 0;
    }

    E题的意思是有两个人,分别轮流去除字符串中的一个字符,一个为了让字符串变小,一个为了让字符串变大,问最后的结果的可能性

    分类讨论题:

    #include<bits/stdc++.h>
    using namespace std;
    int flag[4],x,y,z,len;
    char s[100005];
    bool check01(){
        if(s[len-1]=='0')return 0;
        x=1,y=0,z=0;
        for(int i=0;i<len-1;i++){
            if(s[i]=='1')x++;
            if(s[i]=='0')y++;
            if(s[i]=='?')z++;
        }if(x-(z+y)>=2||y-(x+z)>=1)return 0;
        return 1;
    }
    bool check10(){
        if(s[len-1]=='1')return 0;
        x=0,y=1,z=0;
        for(int i=0;i<len-1;i++){
            if(s[i]=='1')x++;
            if(s[i]=='0')y++;
            if(s[i]=='?')z++;
        }if(x-(z+y)>=2||y-(x+z)>=1)return 0;
        return 1;
    }
    int main(){
        scanf("%s",s);
        len=strlen(s);
        for(int i=0;i<len;i++){
            if(s[i]=='1')x++;
            if(s[i]=='0')y++;
            if(s[i]=='?')z++;
        }if(x+z-y>=2)flag[0]=1;
        if(y+z-x>=1)flag[1]=1;
        if(check01())flag[2]=1;
        if(check10())flag[3]=1;
        if(flag[1])printf("00
    ");
        if(flag[2])printf("01
    ");
        if(flag[3])printf("10
    ");
        if(flag[0])printf("11
    ");
        return 0;
    }
    

      

  • 相关阅读:
    如何检查项目的需求是否完整
    Linux环境 Java内存快速查看
    字符串拼接性能比较出乎意料的结果
    MySQL 查看表大小
    五大机器学习微信公众号推荐
    如何用PYTHON代码写出音乐
    【转载】机器学习如门概览
    机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码)
    【转载】程序猿转型AI必须知道的几件事!
    如何拿到阿里算法校招offer
  • 原文地址:https://www.cnblogs.com/forever97/p/Codeforces97.html
Copyright © 2011-2022 走看看