19 篇文章 0 订阅

# 算法设计第二次上机作业-贪心算法

## 区间合并

#### AC的代码如下：

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
#define Max 50005
struct inteval {
int left;
int right;
};
inteval inputs[Max];
int flag[Max];
int cmp(inteval input1, inteval input2) {

return input1.left<input2.left;
}

int main(int argc, const char * argv[]) {
// insert code here...
int num, top = 0, pretop;
queue<inteval> que;
scanf("%d", &num);
for(int i=0; i<num; i++) {
scanf("%d%d", &inputs[i].left, &inputs[i].right);
}
sort(inputs, inputs+num, cmp);
int maxright = inputs[0].right;
int minleft = inputs[0].left;
int flag = 0;
for(int i=1; i<num; i++) {
if(inputs[i].left > maxright) {
cout<<"no"<<endl;
flag = 1;
break;
}
else if(inputs[i].right >= maxright) {
maxright = inputs[i].right;
}
}
if(flag == 0) {
cout<<minleft<<" "<<maxright<<endl;

}
return 0;
}


#### AC的代码如下：

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define Max 1005
using namespace std;
struct dis {
double left;
double right;
};
int cmp(dis inteval1, dis inteval2) {
return inteval1.right<inteval2.right;
}

int main(int argc, const char * argv[]) {
// insert code here...
int n, d, x, y;
dis intevals[Max];
bool flag = true;
int temp, no = 0;
/*scanf("%d", &temp);
double res = sqrt(pow(temp,2.0)-1);
cout<<res<<endl;*/
while(scanf("%d%d", &n, &d) && n!=0 && d!=0) {
no++;
flag = true;
for(int i=0; i<n; i++) {
scanf("%d%d", &x, &y);
if(y > d) {flag = false; continue;}
double temp_left = x-sqrt(pow(d,2.0)-pow(y,2.0));
double temp_right = x+sqrt(pow(d,2.0)-pow(y,2.0));
intevals[i].left = temp_left;
intevals[i].right = temp_right;
}
if(flag == false) {
cout<<"Case "<<no<<": -1"<<endl;
continue;
}
sort(intevals, intevals+n, cmp);
double max_right = intevals[0].right;
int num = 1;
for(int i=1; i<n; i++) {
if(max_right < intevals[i].left) {
max_right = intevals[i].right;
num++;
}
}
cout<<"Case "<<no<<": "<<num<<endl;
}
return 0;
}


UP更新不错过~
• 0
点赞
• 0
收藏
• 打赏
• 0
评论
02-28 1404
05-26 634
10-09 373
03-10 1260
10-20 1184
03-05 216
03-05 1912
11-21 1510
05-07 1370
02-12 1551
08-01 6035
09-15 1万+
10-04 1万+
12-04 5310
05-21 1595
12-18 1719
05-09 1034

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。