• csp 2019-12-2 回收站选址


    回收站选址题目:

     回首往昔:当时觉得数据好大,不知道如何表示这么大的数据,|x|,|y|<=10^9,当时就很迷......当时的代码,对于数据大的检测点根本通不过。

    于是就写出了这样的代码:

    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define M 1010
    int main(){
        int c;
        long long p=0,q=0,r=0,s=0,t=0;
        scanf("%d",&c);
        long long m[M],n[M];
        bool a[M][M] ={false};
        for(long long i=0;i<c;i++){
        scanf("%lld%lld",&m[i],&n[i]);
        a[m[i]][n[i]]=true;
        }
        for(long long i=0;i<M;i++) {
            for(long long j=0;j<M;j++){
                if(a[i][j]){
                    if(a[i+1][j]&&a[i-1][j]&&a[i][j+1]&&a[i][j-1]){
                    if(a[i+1][j-1]&&a[i-1][j-1]&&a[i-1][j+1]&&a[i+1][j+1])
                        t++;
                    else if((a[i+1][j-1]&&a[i-1][j-1]&&a[i-1][j+1])||(a[i+1][j-1]&&a[i-1][j-1]&&a[i+1][j+1])||(a[i+1][j-1]&&a[i-1][j+1]&&a[i+1][j+1])||(a[i-1][j-1]&&a[i-1][j+1]&&a[i+1][j+1]))
                        s++;
                    else if((a[i+1][j-1]&&a[i-1][j-1])||(a[i+1][j-1]&&a[i-1][j+1])||(a[i+1][j-1]&&a[i+1][j+1])||(a[i-1][j-1]&&a[i-1][j+1])||(a[i-1][j+1]&&a[i+1][j+1])||(a[i-1][j-1]&&a[i+1][j+1]))
                        r++;
                    else
                        q++;
                    }
                }
            }
        }
        printf("%lld
    %lld
    %lld
    %lld
    %lld",p,q,r,s,t);
    }

    当时只知道用二维数组,不知道如何才能表示这样的数字,明知道二维数组不可行,却只能用它......其他的方法一时之间我也想不到,考试时间有限.....

    现在的思路:可以利用结构体,只利用一维数组就可以执行啦。(当时也有想到,但是奈何不知道如何用。。。。),对于之前的代码数据根本可以不用long long

    一般的数据范围 请移步:https://www.cnblogs.com/miao-xixixi/p/12503270.html

     现在的代码:

    #include<iostream> 
    #include<cstring>
    using namespace std;
    int n;
    struct kk{
        int x,y;
    }a[1000];
    bool f(int p,int q){
        for(int i=0;i<n;i++)
        if(a[i].x==p&&a[i].y==q)
        return true;
        return false;
    }      //用来检测该点有没有垃圾,若有垃圾,则遍历的时候发现这个点存在,妙哇~    
    bool count(kk t){
            if(f(t.x-1,t.y)&&f(t.x+1,t.y)&&(f(t.x,t.y+1))&&f(t.x,t.y-1))
            return true;
            return false;
    } //用来检测该点的上下左右有没有垃圾
    
    
    int main(){
        int c[5];
        memset(c,0,sizeof(c));
        int sum=0;    
        scanf("%d",&n);
        for(int i=0;i<n;i++)            
        scanf("%d%d",&a[i].x,&a[i].y);
    //    cout<<c[0]<<endl;
        for(int i=0;i<n;i++){
            if(count(a[i])){ 
                if(f(a[i].x-1,a[i].y-1))
                sum++;
                if(f(a[i].x-1,a[i].y+1))
                sum++;
                if(f(a[i].x+1,a[i].y-1))
                sum++;
                if(f(a[i].x+1,a[i].y+1))
                sum++;
                c[sum]++;
                sum=0;
            }
        }
        for(int i=0;i<5;i++)
        printf("%d
    ",c[i]);
        return 0;
    }
    无聊就学习 反正没事干
  • 相关阅读:
    Java学习(运算符,引用数据类型)
    Java学习(基本语句,语法,变量)
    Java学习(简介,软件安装)
    MySQL连接查询(多表查询)
    MySQL数据约束
    VS code MacOS 环境搭建
    三维空间中xoy平面上特定抛物线的正等测投影解析解的一种求法
    抛物线正等测投影的解析解求法
    抛物线正等测投影数值解的求法
    反向工程“你的使用说明书”小记
  • 原文地址:https://www.cnblogs.com/miao-xixixi/p/12502988.html
Copyright © 2020-2023  润新知