您的位置:首页 > 大数据 > 人工智能

POJ 1230 Pass-Muraille (贪心)

2017-03-09 16:57 369 查看

思路:

从小到大扫,遇到不合格的列就对所有边进行遍历

找出包含这一列的边并计算此边到最右边的长度 删最长边。

#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#include <cmath>
#include <algorithm>
#include <map>
#define pi acos(-1)
#define gg 9.87
#define eps 1e-9

typedef long long int lli;
using namespace std;

struct edge{
int x,y,x2,y2;
}ed[110];

int ans;
int n,k;
int vis[110];
void f(){
for(int i = 0;i <= 100;++i){
if(vis[i] > k){
int maxlen = 0, pos = 0;
int r = 0,l = 0;
for(int j = 1;j <= n;++j){
l = min(ed[j].y,ed[j].y2);
r = max(ed[j].y,ed[j].y2);
if(i >= l && i <= r && r-i >= maxlen){
maxlen = r - i;
pos = j;
}
}
l = min(ed[pos].y,ed[pos].y2);
r = max(ed[pos].y,ed[pos].y2);
ed[pos].y2 = -1,ed[pos].y = -1;// 一开始忘了删边了。。
for(int i = l;i <= r;++i){
vis[i]--;
}
ans++;
i--;
}
}
}
int main(){
int t;
cin>>t;
while(t--){
ans = 0;
memset(vis,0,sizeof(vis));
memset(ed,0,sizeof(ed));
scanf("%d%d",&n,&k);
for(int i = 1;i <= n;++i){
scanf("%d%d%d%d",&ed[i].y,&ed[i].x,&ed[i].y2,&ed[i].x2);
int l = min(ed[i].y,ed[i].y2);
int r = max(ed[i].y,ed[i].y2);
for(int i = l;i <= r;++i){
vis[i]++;
}
}
f();
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: