BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #92831同步于 2017/4/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

今晚微软第一题(Queen Attack)

Tension1900
2017/4/8镜像同步18 回复
## 找出问题了。 感谢9楼。 > int类型的7/5=1 ### 没想到这种问题也十大了... ### 我的思路O(n2)最多最多也就过80%,来这提问就是想搞清楚为啥一个都没过... ### 像14楼说的,可以AC的思路应该是建四个map, 代表米字型四个方向。最后每条方向求C(n,2) ## [hiho上的试题地址](https://hihocoder.com/problemset/problem/1497) # 结贴 ! *** 我的思路: 假设有N的皇后。 我在处理第1个皇后的时候,就看从第2个皇后到最后一个皇后,有多少个皇后可以和第1个皇后攻击(三种方式,有一种满足即可)。有一个就count++。 处理第2个皇后的时候,就看从第3个皇后到最后一个皇后,有多少个皇后可以和第2个皇后攻击。有一个就count++。 .... 一直到第N-1个皇后。 ----------------------------- ## 我说下我的思路吧(最终0分),大家看看哪不对。。。 ### 建一个二维数组pos[N][2] 放N个点的坐标 ```Python for i in 0到N-1 for j in i+1到N if pos[i][0] == pos[j][0] // (垂直) count++; else if pos[i][1] == pos[j][1] // (平行) count++; else if (pos[j][1]-pos[i][1])/(pos[j][0]-pos[i][0]) 的绝对值 == 1 count++; ``` ### 最后输出count #### 我是帮同学做的,改了三次,都是0分。关键是我本地的测试用例都过了呀。。。 ### 有没有大神说下我的思路哪里不对,或者提供几个边界用例。 # 这个问题想不明白,今晚真睡不好了!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
liuyehcf机器人#1 · 2017/4/8
count++不对吧,假设某一列有n个queue,如果此时又找到一个queue位于该列,那么应该是count+=n,这原有的n个queue可以和现在这queue组成n个pair
Tension1900机器人#2 · 2017/4/8
【 在 liuyehcf 的大作中提到: 】 : count++不对吧,假设某一列有n个queue,如果此时又找到一个queue位于该列,那么应该是count+=n,这原有的n个queue可以和现在这queue组成n个pair 我不是按照这样找的。 假设有N的皇后。 我在处理第1个皇后的时候,就看从第2个皇后到最后一个皇后,有多少个皇后可以和第1个皇后攻击(三种方式,有一种满足即可)。有一个就count++。 处理第2个皇后的时候,就看从第3个皇后到最后一个皇后,有多少个皇后可以和第2个皇后攻击。有一个就count++。
liuyehcf机器人#3 · 2017/4/8
刚没看仔细哈,这样好像没啥问题。。。(j应该从i+1到N-1,不然会越界啊) 会不会是你输出的格式不对?题目的要求是通过标准输出返回 【 在 Tension1900 的大作中提到: 】 : 我不是按照这样找的。 : 假设有N的皇后。 : 我在处理第1个皇后的时候,就看从第2个皇后到最后一个皇后,有多少个皇后可以和第1个皇后攻击(三种方式,有一种满足即可)。有一个就count++。 : ...................
BK机器人#4 · 2017/4/8
#include<bits/stdc++.h> using namespace std; map<long long,long long> m1; map<long long,long long> m2; map<long long,long long> m3; map<long long,long long> m4; int main() { int n; cin>>n; while(n--) { int a,b; cin>>a>>b; m1[a]++; m2[b]++; m3[a-b]++; m4[b+a]++; } long long res=0; for(auto i:m1) { res+=i.second*(i.second-1)/2; } for(auto i:m2) { res+=i.second*(i.second-1)/2; } for(auto i:m3) { res+=i.second*(i.second-1)/2; } for(auto i:m4) { res+=i.second*(i.second-1)/2; } cout<<res<<endl; }
BK机器人#5 · 2017/4/8
m2[b]加加
Tension1900机器人#6 · 2017/4/8
【 在 liuyehcf 的大作中提到: 】 : 刚没看仔细哈,这样好像没啥问题。。。(j应该从i+1到N-1,不然会越界啊) : 会不会是你输出的格式不对?题目的要求是通过标准输出返回 格式应该没问题,真是搞不懂了
mrcuber机器人#7 · 2017/4/8
逻辑貌似没问题,我猜两个原因吧。1:O(n^2)的都是0分.....2:返回值可能溢出,必须用long存。正解楼上有了
MrHungry机器人#8 · 2017/4/8
我和楼主一样的思路,java写的,结果也是用long存的,结果只通过百分之十。并没有提示超时,实在想不懂 【 在 liuyehcf 的大作中提到: 】 : 刚没看仔细哈,这样好像没啥问题。。。(j应该从i+1到N-1,不然会越界啊) : 会不会是你输出的格式不对?题目的要求是通过标准输出返回
LXYXYNT机器人#9 · 2017/4/8
整数除法吧?7/5=1什么的