今天遇到一题算法题,涉及到排序sort的bool判断值,如果能用到多重排序,题目就会好解很多。
其题目是这样的:

…….明早再补了
[ppyImcQ.png

先上AC代码块:

#include<bits/stdc++.h> 

using namespace std;
const int N = 1e5 + 7;
struct NODE{
long long a,w;
}node [N];
long long n,sum,ans;
bool cmp(NODE n1, NODE n2){
if(n1.a < n2.a) return true;
if(n1.a == n2.a && n1.w <= n2.w) return true;
return false;
}
int main( )
{
cin>>n;
for (int i=1;i<=n;i++){
cin>>node[i].a>>node[i].w;
sum += node[i].w;
}
sort(node + 1,node+n+1,cmp);
NODE temp = node[0];
for(int i=1;i<=n+1;i++){
if(node[i].a != temp.a)
ans += temp.w;
temp = node[i];
}
cout<<sum - ans;

return 0;
}

sort排序中的自定义排序需要头文件\
bool cmp()函数名只是便于知道这是一个比较函数,通过所返回的bool值来实行具体的排序顺序,其名字可以随意,只要满足是bool类型返回值以及符合变量命名规则即可。

sort排序中默认的排序规则是从小到大,是升序排序。那么如何改变这一默认排序规则呢?
举个栗子:

#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}

这里的逻辑是:sort排序默认是a&ltb是返回true的布尔值,而这里返回a&gtb,则返回false与默认的true所矛盾,因此需要改变默认的排序方式。其实就是有一个简单的记忆方法————将想要进行的排序return true,不想的排序则返回false即可。需要注意的是,return 即代表函数的结束,函数体内剩下没执行的代码则会被忽略掉。

结构体也可以根据其成员数据进行排序,举个栗子:

#include<algorithm>
using namespace std;
struct node{
int a;
int b;
int c;
};
bool cmp(node x,node y){ //传入两个结构体对象
if(x.a!=y.a) return x.a<y.a;
if(x.b!=y.b) return x.b>y.b;
if(x.c!=y.c) return x.c<y.c;
}


这里定义的cmp是先按照a进行升序排序,如果a相同的话对b及逆行降序排序,如果两个结构体中a、b数据成员均相等的话,就以数据成员c进行升序排序。

而对于本题而言,其实也是根据结构体内部的数据进行排序,先利用其用数字来代表课的种类,因此可以根据课的种类对课程先进行一个升序排序,让同一种课能够在连续的一段,然后在课程的内部再进行升序排序。这样的话,在一种课的类别的最后就是该课程的最大疲劳度,再利用for循环对其最后端进行累加得到各个类别课的疲劳度的最大值的累加和ans。到这里只需在一开始输入的时候累加各门课的疲劳度即可得到总疲劳度sum,最后总疲劳度sum减去最大疲劳度累加和ans即可得到答案。

C++进制转换的技巧

#include<iostream>
using namespace std;
//dec——decimal是十进制 cout<<dec<<a 就会把b转换成10进制再输出;
//hex——hexadecimal是16进制 cout<<dec<<a 就会把b转换成16进制再输出;
//oct——octomal是八进制 cout<<dec<<a 就会把b转换成8进制再输出;
int main()
{
int a;
cin>>a;
cout<<oct<<a;
return 0;
}