牛客网练习赛13---m皇后
2018-03-20 19:53
176 查看
题目链接
这道题简单来说就是暴力
原本思路是找出各个方向上的最远点
记录一下,然后暴力所有的点
然后暴力该点有多少个危险方向
然后看了大牛博客,学习了新方法
将所有点排序
比如纵列,先排序,是同一列的排一块,扫一遍该列
对于每一个元素,看一下后面有没有元素,如果有,那么该元素的下面方向不安全
对于上面的元素,上面的方向不安全,两者的不安全的方向都+1
其他方向的同理,总共四条直线
只用扫描4次就行#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
int t[9];
struct node
{
int x,y;//储存坐标
int H,s,p,q;//H表示所在的行,S表示所在的列,p,q表示所在的斜行
int num;//表示该点不安全的方向有几个
}huang[maxn];
bool cmp1(node a,node b)
{
if(a.H!=b.H)
return a.H<b.H;
else
return a.s<b.s;
}
bool cmp2(node a,node b)
{
if(a.s!=b.s)
return a.s<b.s;
else
return a.H<b.H;
}
bool cmp3(node a,node b)
{
if(a.p!=b.p)
return a.p<b.p;
else
return a.s<b.s;
}
bool cmp4(node a,node b)
{
if(a.q!=b.q)
return a.q<b.q;
else
return a.s<b.s;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int x,y;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
huang[i].x=x,huang[i].y=y;
huang[i].H=y,huang[i].s=x;
huang[i].p=x-y;
huang[i].q=x+y;
}
sort(huang,huang+m,cmp1);
for(int i=1;i<m;i++)
{
if(huang[i].H==huang[i-1].H)
{
huang[i].num++;
huang[i-1].num++;
}
}
sort(huang,huang+m,cmp2);
for(int i=1;i<m;i++)
{
if(huang[i].s==huang[i-1].s)
{
huang[i].num++;
huang[i-1].num++;
}
}
sort(huang,huang+m,cmp3);
for(int i=1;i<m;i++)
{
if(huang[i].p==huang[i-1].p)
{
huang[i].num++;
huang[i-1].num++;
}
}
sort(huang,huang+m,cmp4);
for(int i=1;i<m;i++)
{
if(huang[i].q==huang[i-1].q)
{
huang[i].num++;
huang[i-1].num++;
}
}
memset(t,0,sizeof(t));
for(int i=0;i<m;i++)
{
t[huang[i].num]++;
}
for(int i=0;i<=7;i++)
printf("%d ",t[i]);
printf("%d\n",t[8]);
}
这道题简单来说就是暴力
原本思路是找出各个方向上的最远点
记录一下,然后暴力所有的点
然后暴力该点有多少个危险方向
然后看了大牛博客,学习了新方法
将所有点排序
比如纵列,先排序,是同一列的排一块,扫一遍该列
对于每一个元素,看一下后面有没有元素,如果有,那么该元素的下面方向不安全
对于上面的元素,上面的方向不安全,两者的不安全的方向都+1
其他方向的同理,总共四条直线
只用扫描4次就行#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
int t[9];
struct node
{
int x,y;//储存坐标
int H,s,p,q;//H表示所在的行,S表示所在的列,p,q表示所在的斜行
int num;//表示该点不安全的方向有几个
}huang[maxn];
bool cmp1(node a,node b)
{
if(a.H!=b.H)
return a.H<b.H;
else
return a.s<b.s;
}
bool cmp2(node a,node b)
{
if(a.s!=b.s)
return a.s<b.s;
else
return a.H<b.H;
}
bool cmp3(node a,node b)
{
if(a.p!=b.p)
return a.p<b.p;
else
return a.s<b.s;
}
bool cmp4(node a,node b)
{
if(a.q!=b.q)
return a.q<b.q;
else
return a.s<b.s;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int x,y;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
huang[i].x=x,huang[i].y=y;
huang[i].H=y,huang[i].s=x;
huang[i].p=x-y;
huang[i].q=x+y;
}
sort(huang,huang+m,cmp1);
for(int i=1;i<m;i++)
{
if(huang[i].H==huang[i-1].H)
{
huang[i].num++;
huang[i-1].num++;
}
}
sort(huang,huang+m,cmp2);
for(int i=1;i<m;i++)
{
if(huang[i].s==huang[i-1].s)
{
huang[i].num++;
huang[i-1].num++;
}
}
sort(huang,huang+m,cmp3);
for(int i=1;i<m;i++)
{
if(huang[i].p==huang[i-1].p)
{
huang[i].num++;
huang[i-1].num++;
}
}
sort(huang,huang+m,cmp4);
for(int i=1;i<m;i++)
{
if(huang[i].q==huang[i-1].q)
{
huang[i].num++;
huang[i-1].num++;
}
}
memset(t,0,sizeof(t));
for(int i=0;i<m;i++)
{
t[huang[i].num]++;
}
for(int i=0;i<=7;i++)
printf("%d ",t[i]);
printf("%d\n",t[8]);
}
相关文章推荐
- 牛客网 牛客练习赛13-幸运数字Ⅰ
- 牛客网 牛客练习赛13 - 幸运数字Ⅱ
- 【[Offer收割]编程练习赛13 D】骑士游历(矩阵快速幂模板)
- 牛客练习赛13-C题幸运数字III
- 牛客练习赛13 A B C F【二分+思维】
- 牛客练习赛13 D 幸运数字Ⅳ[康拓展开逆运算]
- 【[Offer收割]编程练习赛13 D】骑士游历(矩阵模板,乘法,加法,乘方)
- 牛客练习赛13-E-乌龟跑步(DP)
- 【[Offer收割]编程练习赛13 B】最大子矩阵(别人的思路)
- 牛客网练习赛12 --AB
- 牛客练习赛13 幸运数字Ⅱ(BFS,DFS,二分,思路)
- 牛客网练习赛25 C 再编号
- 【[Offer收割]编程练习赛13 B】最大子矩阵(自己的思路)
- 牛客练习赛13题目题解
- 【牛客练习赛13】D 幸运数字Ⅳ 【康拓展开】
- 牛客练习赛13 E 乌龟跑步 (dp)
- 【[Offer收割]编程练习赛13 A】风格不统一如何写程序
- P1219 N皇后(6<=N<=13)
- 牛客网 wannfly练习赛7 B 购物 dp
- 牛客网练习赛7-购物