18_1
Posted sybil-hxl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了18_1相关的知识,希望对你有一定的参考价值。
一、收获:
1.qsort函数对数组、结构体等进行排序
#include <stdlib.h>//必须用stdlib.h,没用.h不用namespace不行
参数:1待排序数组首地址 2数组中待排序元素数量 3各元素的占用空间大小 4指向函数的指针,用于确定排序的顺序
eg:
(1)重写cmp,固定参数,变化的只是比较内容
int cmp(const void *a,const void *b){
return (*(XianDuan*)b).xd_num - (*(XianDuan*)a).xd_num;
}
此处为降序,后者大于前者时,交换位置;a-b为升序
此处(*(XianDuan*)b).xd_num进行强转时,最前面的*不能丢,因为这里用的是指针而非引用,*b表示访问其值
(2)调用qsort函数
qsort(xd,num,sizeof(struct XianDuan),cmp);
2.使用freopen输入重定向,输入数据将从in.txt文件中读取
freopen("G:/in.txt","r",stdin);
必须使用using namespace std;否则不能使用
3.两处算法问题
if(i != j && xd[i].b_x == xd[j].a_x && xd[i].b_y == xd[j].a_y){
xd[i].b_x = xd[j].b_x;
xd[i].b_y = xd[j].b_y;
xd[i].xd_num += xd[j].xd_num;//此处也不是+1,而是两个长度相加
}else if(i != j && xd[j].b_x == xd[i].a_x && xd[j].b_y == xd[i].a_y){//只有上面if没有遍历完全,必须再反过来测试,否则会丢失“1 7 2 5”这一段
xd[j].b_x = xd[i].b_x;
xd[j].b_y = xd[i].b_y;
xd[j].xd_num += xd[i].xd_num;
}
二、题目
/*
第一题
给若干条线段,线段的右点的横坐标必然比左点的横坐标大,第一行输入n,以后输入n行,每行为左右点的横纵坐标,
一些线段可以连在一起,输出连在一起的大线段最多有多少条线段,以及该大线段的起点
一条线段有a b两端点,a坐标为(a-x,a-y),b坐标为(b-x,b-y),且b点x坐标一定大于a点x坐标。给出若干个线段,
收尾相同的线段可以相连(不会形成环),请输出可以组成线段,中包含线段最多的个数,以及合并后的起点坐标。
输入格式:线段个数,每行为线段坐标。
输出格式:最大线段数,线段起点
样例输入:
6
0 2 1 7
2 5 9 6
3 4 7 8
9 6 11 12
7 9 10 19
1 7 2 5
样例输出:
402
*/
三、思路
1.把数据读入
2.合并首尾相连的线段,并且对线段数求和(五星)
3.排序,按要求输出最长的那个
四、代码
#include <iostream>
#include <stdlib.h>//qsort参数:1待排序数组首地址 2数组中待排序元素数量 3各元素的占用空间大小 4指向函数的指针,用于确定排序的顺序
using namespace std;
struct XianDuan{
int a_x;
int a_y;
int b_x;
int b_y;
int xd_num;//你的数据结构没有新线段中原始线段条数,缺乏一个合并的过程,怪不得没法处理
};
int cmp(const void *a,const void *b){
return (*(XianDuan*)b).xd_num - (*(XianDuan*)a).xd_num;
}
void main(){
freopen("G:/in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取
int num;
cin>>num;
XianDuan *xd = new XianDuan[num];
for(int i=0;i<num;i++){
cin>>xd[i].a_x>>xd[i].a_y>>xd[i].b_x>>xd[i].b_y;
xd[i].xd_num = 1;//忘记初始化
if(xd[i].a_x >= xd[i].b_x){
cout<<"不满足:右点的横坐标比左点的横坐标大!"<<endl;
delete[] xd;
exit(0);
}
}
for(i=0;i<num;i++){
for(int j=0;j<num;j++){
if(i != j && xd[i].b_x == xd[j].a_x && xd[i].b_y == xd[j].a_y){
xd[i].b_x = xd[j].b_x;
xd[i].b_y = xd[j].b_y;
xd[i].xd_num += xd[j].xd_num;//此处也不是+1,而是两个长度相加
}else if(i != j && xd[j].b_x == xd[i].a_x && xd[j].b_y == xd[i].a_y){//只有上面if没有遍历完全,必须再反过来测试
xd[j].b_x = xd[i].b_x;
xd[j].b_y = xd[i].b_y;
xd[j].xd_num += xd[i].xd_num;
}
}
}
qsort(xd,num,sizeof(struct XianDuan),cmp);
cout<<xd[0].xd_num<<xd[0].a_x<<xd[0].a_y<<endl;
delete[] xd;
}
以上是关于18_1的主要内容,如果未能解决你的问题,请参考以下文章