HDU 4380 Farmer Greedy
来源:互联网 发布:dota2 newbee 知乎 编辑:程序博客网 时间:2024/06/11 06:03
这道题,队长大人说,用bitset&三下就好了。。
然后死在了bitset的分类讨论上了。。
这道题,先看复杂度 100 * 100(所有线段)* 1000 == 1e7;
这样就可以做了
思路就是统计在线段上和下的点数,bitset就是这个作用。。
但是,经过昨晚一晚上的郁闷,其实只要知道每条边的下面的点数就够了。这个思路画画图就出来了。然后wa了,才知道边上的点也算在内。(而且根据自己的尝试发现没有房子和金子在同一点的点)
于是,只要简单的分类讨论就可以,bitset的方法(弱弱的我是觉得不是很适合)。
然后,辉说 用叉积奇快,居然只有78ms。。
这里给出我的做法。。
#include <cstdio>#include <iostream>#include <cstring>#include <string>#include <algorithm>#include <bitset>using namespace std;const int N = 110;const int M = 1010;struct myhouse{ int x; int y; bool operator < (const myhouse & wakaka)const { if(y == wakaka.y) { return x < wakaka.x; } return y < wakaka.y; }}house[N], gold[M];struct edges{ int on; int under;}edge[N * N];int main(){ int n, m; int cas = 0; while(~scanf("%d%d", &n, &m)) { for(int i = 0 ; i < n ; ++ i) { scanf("%d%d", &house[i].x ,&house[i].y); } for(int j = 0 ; j < m ; ++ j) { scanf("%d%d", &gold[j].x ,&gold[j].y); } sort(house , house + n);//这一步少了很多分类。。 memset(edge , 0 ,sizeof(edge)); for(int i = 0 ;i < n ; ++ i) { for(int j = i + 1; j < n ; ++ j) { for(int k = 0 ; k < m ; ++ k) { if(house[i].x == house[j].x) { if(gold[k].x == house[i].x) { if(gold[k].y < house[i].y) { edge[i * n + j].under ++; } else if(gold[k].y < house[j].y) { edge[i * n + j].on ++; } } } else if(gold[k].x <= max(house[i].x, house[j].x) && gold[k].x >= min(house[i].x ,house[j].x)) { double test; if(house[j].x > house[i].x) test = (double)(house[j].y - house[i].y) / (house[j].x - house[i].x) * (gold[k].x - house[i].x)+ house[i].y; else test = (double)(house[j].y - house[i].y) / (house[j].x - house[i].x) * (gold[k].x - house[j].x)+ house[j].y; if(test > gold[k].y) { edge[i * n + j].under ++; } else if(test == gold[k].y) { edge[i * n + j].on ++; } } } } } int test; int ans = 0; for(int i = 0 ; i < n ; ++ i) { for(int j = i + 1 ; j < n ; ++ j) { for(int k = j + 1 ; k < n ; ++ k) { if(house[i].x == house[k].x) { test = edge[j * n + k].under - edge[i * n + j].under + edge[j * n + k].on; } else if(house[j].x == house[k].x) { test = edge[i * n + k].under - edge[i * n + j].under + edge[i * n + k].on; } else { test = edge[i * n + k].under + edge[j * n + k].under - edge[i * n + j].under + edge[i * n + k].on +edge[j * n + k].on + edge[i * n + j].on; } if(test & 1) ++ ans; } } } printf("Case %d: %d\n", ++ cas, ans); } return 0;}
0 0
- HDU 4380 - Farmer Greedy
- HDU 4380 Farmer Greedy
- [计算几何] hdu 4380 Farmer Greedy
- HDU 4380 Farmer Greedy (计算几何)
- HDU 4380 Farmer Greedy 计算几何+bitset
- HDU 4380 Farmer Greedy 极角排序 DP
- hdu_4380 Farmer Greedy (计算几何)
- BNU 0822 A. Farmer Greedy
- Greedy? HDU
- hdu 4221Greedy?
- hdu 1338 #greedy
- HDU 4221 Greedy?
- hdu 4221 Greedy?
- hdu 1009--greedy
- HDU 4221 Greedy?
- hdu 1052 (greedy algorithm)
- 贪心--HDU - 4221 Greedy?
- hdu Greedy 4221 (贪心)
- iOS解析lrc歌词文档
- MyBatis主流程分析之(一)-环境准备
- android中的activity---intent
- Android异步任务机制之Handler
- 云服务器搭建hadoop集群
- HDU 4380 Farmer Greedy
- 菜鸟的请教
- Android异步任务机制之AsyncTask
- 模拟通讯录系统的简单实现
- NumPy常见函数和使用示例
- POJ-3281 Dining (最大流[Ford-Fulkerson])
- 数组对比,保留不存在的
- 树莓派学习系列3——树莓派的远程登录操作(图文)
- 爬虫之煎蛋网妹子图 大爬哦