您的位置:首页 > 其它

struct基础&通过struct和sort结合代替vector列排列

2017-09-04 01:20 225 查看
通过这道题对struct和vector有了一定程度的理解。

一般struct的声明如下所示,之前还有一篇写数据结构的文章可以参考。

结构体的使用

在C和C++一般有三种定义结构的方法。

typedef struct {
int data;
int text;
} S1;


//这种方法可以在c或者c++中定义一个S1结构

struct S2 {
int data;
int text;
};


// 这种定义方式只能在C++中使用,而如果用在C中,那么编译器会报错

struct {
int data;
int text;
} S3;


这种方法并没有定义一个结构,而是定义了一个s3的结构变量,编译器会为s3内存,注意:之后是无法使用S3 test;这样的方式定义新的结构体变量的
typedef struct和struct的区别在于方法一和三,法一可以用 S1 test;这样的方法定义新的变量,而法三不可以。

要使用此函数只需用#include <algorithm> sort即可使用,语法描述为:

sort(begin,end), sort(begin,end,compare)两种

begin,end为基础参数通过制定首位指针来做升序排列,

如果想要降序排列就需要引入compare函数了

bool compare(int a,int b)
{
return a<b; //升序排列,如果改为return a>b,则为降序
}


这种方式对vector<int> , a[]等都是可行的,但是如果针对的是二维数组想参照某一列来进行升序或降序排列是无法实现的,他只能实现单行的排列。

如果有按列排序的需求,并且其他同行的元素会跟着某列同时变换要怎么做呢,这时就要引入通过结构体的排序来解决了,可以针对结构体内的某一元素或在值相同情况下参照第二第三元素来排序。

举个形象例子说明,按年龄排序首先考虑年龄,当年龄相同时按姓名排序等。

bool cmp(struct people a,struct people a){

if(a.age!=b.age)

return a.age<b.age;//降序排列

else

return a.name<b.name;//年龄相同,按名字排序

}

在结构体定义新的变量时,如来定义一个新的有一定空间的变量呢?

struct Couse *a;
a = new Couse
;
或
struct Couse *a = new Couse
;
或
struct Data
{
char data[100];
}str[100];
实际上1、2是同一种,三是在确定元素大小的情况下使用,一二则不受此限制。这里写的几点都是在做下边这道题时遇见的,通过这道题对于上边几个知识点有了一定深度的理解。小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg。每门课由平时成绩和考试成绩组成,满分为r。现在他知道每门课的平时成绩为ai ,若想让这门课的考试成绩多拿一分的话,小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。为了拿到奖学金,小v至少要花多少时间复习。输入描述:第一行三个整数n,r,avg(n大于等于1小于等于1e5,r大于等于1小于等于1e9,avg大于等于1小于等于1e6),接下来n行,每行两个整数ai和bi,均小于等于1e6大于等于1输出描述:一行输出答案。示例1输入5 10 90 59 18 10 19 100输出43


#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
struct Couse{
int grade;
int time;
};
bool cmp(struct Couse a,struct Couse b){
return a.time<b.time;
}

int main() {
int  n,r,avg;
while(cin>>n>>r>>avg){
struct Couse *a;
a = new Couse
;
long long total=avg*n;
long long sum=0;
long long timeneed=0;
for(int i=0;i<n;i++){
cin>>a[i].grade>>a[i].time;
sum+=a[i].grade;
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
while(a[i].grade<r){
if(sum>=total)
break;
sum+=1;
a[i].grade++;
timeneed+=a[i].time;
}
}
cout<<timeneed<<endl;
}
return 0;
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐