放在这里是因为这个题貌似没有公开评测了….我是在coursera算法公开课内评测成功的,觉得还是有一定纪念意义的,虽然懂了之后只是水题一道,但是这种看似复杂,其实很水的题有时候真是会很影响心情= =
Openjudge 原题网址:http://bailian.openjudge.cn/tm201401/B/
原题:
- Description
2014 年巴西世界杯(2014 FIFA World Cup)开踢啦!为了方便球迷观看比赛,里约街道上很多路口都放置了的直播大屏幕,但是人群散去后总会在这些路口留下一堆垃圾。为此巴西政府决定动用一种 最新发明——“垃圾炸弹”。这种“炸弹”利用最先进的量子物理技术,爆炸后产生的冲击波可以完全清除波及范围内的所有垃圾,并且不会产生任何其他不良影 响。炸弹爆炸后冲击波是以正方形方式扩散的,炸弹威力(扩散距离)以d给出,表示可以传播d条街道。
例如下图是一个d=1的“垃圾炸弹”爆炸后的波及范围。
假设里约热内卢市的布局为严格的1025*1025的网格状,由于财政问题市政府只买得起一枚“垃圾炸弹”,希望你帮他们找到合适的投放地点,使得一次清除的垃圾总量最多(假设垃圾数量可以用一个非负整数表示,并且除设置大屏幕的路口以外的地点没有垃圾)。
- Input
- 输入第一行是整数T (1 <= T <= 10),表明有T组测试数据。
对于每一组测试数据,第一行给出“炸 弹”威力d(1 <= d <= 50)。第二行给出一个数组n(1 <= n <= 20)表示设置了大屏幕(有垃圾)的路口数目。接下来n行每行给出三个数字x, y, i, 分别代表路口的坐标(x, y)以及垃圾数量i. 点坐标(x, y)保证是有效的(区间在0到1024之间),同一坐标只会给出一次。
- Output
- 对于每组测试数据,输出能清理垃圾最多的投放点数目,以及能够清除的垃圾总量。
- Sample Input
1 1 2 4 4 10 6 6 20
- Sample Output
1 30
- AC Code:
1 //Garbage bomb 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 7 #define MAX 1025 8 9 int map[MAX][MAX]; //枚举地图各点可清除垃圾数 10 11 /*垃圾点*/ 12 struct Point{ 13 int x, y; //坐标 14 int m; //垃圾数 15 }p[21]; 16 17 int main() 18 { 19 int T; 20 scanf("%d", &T); 21 while (T--) 22 { 23 memset(map, 0, sizeof(map)); 24 int d, n; 25 scanf("%d%d", &d, &n); 26 for (int i = 0; i < n; i++) 27 scanf("%d%d%d", &p[i].x, &p[i].y, &p[i].m); 28 29 int ans = 0, np = 0; 30 for (int i = 0; i < n; i++) 31 { 32 int sum = 0; 33 for (int row = p[i].x - d; row <= p[i].x + d; row++) 34 if (row >= 0 && row < MAX){ 35 for (int col = p[i].y - d; col <= p[i].y + d; col++) 36 { 37 if (col >= 0 && col < MAX) 38 { 39 map[row][col] += p[i].m; 40 /*refresh*/ 41 if (ans < map[row][col]) 42 { 43 ans = map[row][col]; 44 np = 1; 45 } 46 else if (ans == map[row][col]) np++; 47 } 48 } 49 } 50 } 51 printf("%d %d\n", np, ans); 52 } 53 return 0; 54 }