回收站选址
from CCF-CSP 2019-12-2
Time limit:1s
Memory limit:512MB
这个题目n的个数是1000,所以是可以直接O(n2)暴力解决的,我们在嵌套循环里面分别记录某个点上下左右垃圾的个数和对角位置垃圾的个数,如果上下左右四个位置都存在垃圾,那么这个点是适合建立垃圾回收站的,进而把得分存入score数组就可以了。
ac代码:
#include<iostream>
using namespace std;
pair<int,int> pii[1005];//存储点的信息
int score[5]; //第0,1,2,3,4个位置分别记录得分为0,1,2,3,4的点的个数
int n;
bool check1(int x1,int y1,int x2,int y2){ //检查第二个点是否是第一个点的上下左右点
if(x1 == x2 && (y1 == y2 + 1 || y1 == y2 - 1))
return true;
if(y1 == y2 && (x1 == x2 + 1 || x1 == x2 - 1))
return true;
return false;
}
bool check2(int x1,int y1,int x2,int y2){ //检查第二个点是否是第一个点的对角点
if((x1 == x2 + 1 || x1 == x2 - 1) && (y1 == y2 + 1 || y1 == y2 - 1))
return true;
return false;
}
int main(){
cin>>n;
for(int i = 1;i <= n;++i) //输入点信息
cin>>pii[i].first>>pii[i].second;
for(int i = 1;i <= n;++i){
int grade = 0,note = 0; //grade记录分数,note记录上下左右点出现了多少个
for(int j = 1;j <= n;++j){
if(check1(pii[i].first,pii[i].second,pii[j].first,pii[j].second))
++note;
if(check2(pii[i].first,pii[i].second,pii[j].first,pii[j].second))
++grade;
}
if(note == 4) //如果note等于4,那么这个点适合建立回收站
++score[grade];
}
for(int i = 0;i <= 4;++i)
cout<<score[i]<<"\n";
return 0;
}