机器人
Problem:219
Time Limit:1000ms
Memory Limit:65536K
Description
公司所能提供的机器人,可以用来捡体育活动和音乐会的垃圾。在一个矩形区域内,机器人从左上角出发,每次只能沿着现在位置的下方和右方移动,在移动过程中收拾垃圾,一直到区域的右下角,现在给出所有垃圾的位置。一旦一个机器人到达目的地右下角不能重新回收再利用。 因为你的费用是成正比的,机器人的使用数量为一份特定的工作,你有兴趣的最小数目的机器人可以清洁的一个给定的领域。例如,考虑在图1中显示的行和列数,如图所示的位置和垃圾标有“G”。在该方案中,所有的机器人将开始在位置1,1,结束于位置(7,6)。 图1 -一个地图 图2显示以下两个可行的解决方法,第二部分是可取的,因为它使用了两个机器人而不是三个。 图2 -两个可行的解决方法 你的任务是写一个程序,以确定捡起所有的垃圾所需机器人的最小数目。
Input
输入包含多个样例,每一行的两个整数表示了垃圾在地图中的位置,每一个样例以0 0作为结束符,数的行和列如图1所示。没有一种地图将会超过500行和500列。
Output
在一行中输出捡起所有的垃圾所需机器人的最小数目。
Sample Input
1 2 1 4 2 4 2 6 4 4 4 7 6 6 0 0 1 1 2 2 4 4 0 0 -1 -1
Sample Output
2 1
这道题是一道比较水的贪心,主要想好如何处理x,y的关系就好,先给x从小到大排序,然后如果相等给y从小到大排序,
因为我只能向右或者向下,所以我就判断这一个点走没走过,并且,只要当前这点的y大于等于之前的一点y就可以走,不然需要重新放置一个机器人
# include <iostream>
# include <cstring>
# include <cstdio>
# include <algorithm>
using namespace std;
const int maxn = 505;
struct node
{
int x, y;
bool flag;
}s[maxn];
bool cmp(struct node a, struct node b)
{
return a.x != b.x ? a.x < b.x : a.y < b.y;
}
int main(int argc, char *argv[])
{
int a, b;
while(cin >> a >> b, (a != -1 || b != -1))
{
int sum = 0;
while(a && b)
{
s[sum].x = a;
s[sum].y = b;
s[sum++].flag = false;
cin >> a >> b;
}
sort(s, s + sum, cmp);
int c = 0;
int flag;
for(int i = 0; i < sum; i++)
{
if(!s[i].flag)
{
c++;
flag = s[i].y;
for(int j = i + 1; j < sum; j++)
{
if(!s[j].flag && s[j].y >= flag)
{
flag = s[j].y;
s[j].flag = true;
}
}
}
}
cout << c << endl;
}
return 0;
}