1.蓝桥杯算法提高VIP-身份证排序
题目描述
安全局搜索到了一批(n个)身份证号码,希望按出生日期对它们进行从大到小排序,如果有相同日期,则按身份证号码大小进行排序。身份证号码为18位的数字组成,出生日期为第7到第14位
输入
第一行一个整数n,表示有n个身份证号码
余下的n行,每行一个身份证号码。
数据规模和约定
n< =100000
输出
按出生日期从大到小排序后的身份证号,每行一条
样例输入
5
466272307503271156
215856472207097978
234804580401078365
404475727700034980
710351408803093165
样例输出
404475727700034980
234804580401078365
215856472207097978
710351408803093165
466272307503271156
解题思路
1.用vector来储存身份证号码
2.用sort()函数对其进行排序,关键点在sort()函数里面参数cmd的写法,按自己的排序顺序进行排序
3.字符串抓取substr()的使用
4.cout输出与printf()输出的时间消耗问题
5.关于cout与printf()的理解
#include<iostream>
#include<iomanip>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
bool cmp(string a, string b)//sort得自定义排序
{
return a.substr(6, 8) > b.substr(6, 8) || (a.substr(6, 8) == b.substr(6, 8) && a > b);//提取字符串中的子
}
int main()
{
int n;
cin >> n;
vector<string>str;
string s;
for (int i = 0; i < n; i++)
{
cin >> s;
str.push_back(s);
}
sort(str.begin(),str.end(), cmp);
for (int i = 0; i < n; i++)
{
//cout << str[i] << endl;//用cout导致超时
printf("%s\n", str[i].c_str());//用c的printf()输出不会超时
}
return 0;
}
2.1试题 算法提高 搬运冰块
问题描述
丑枫接到了一份奇葩的工作:往冰库里搬运冰块.冰库外放着N箱冰块,由于室外温度高,冰块会很快融化,且每箱冰块的融化速度不同.因为每箱冰块的体积,质量不等,把每箱冰块搬运进冰块花费的时间也不同.因此需要合理安排搬运顺序,才能使总的冰块融化量最小.丑枫请你帮忙计算最少的总融化量是多少,以便汇报上司.
输入格式
第一行输入整数N
接下来N行,每行两个整数,分别表示每箱冰块的搬运耗时Ti及融化速度Di.
输出格式
输出最少的总融化量
样例输入
6
6 1
4 5
4 3
6 2
8 1
2 6
样例输出
86
数据规模和约定
2<=N<=100000,1<=Ti<=4000000,1<=Di<=100
思路
根据融化体积来进行排序,每次都选取融化体积最小的,最后的融化体积就是最小的,当搬运第i个物体,那么第j个物体的融化体积为v=Ti*Dj,
#include<iostream>
#include<iomanip>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
struct Bingkuai//定义一个结构体
{
long int Ti;
int Di;
};
bool cmp(Bingkuai a, Bingkuai b)//对结构体的sort()排序进行更改
{
return a.Ti * b.Di < b.Ti* a.Di;
}
int main()
{
int n;
cin >> n;
Bingkuai* tem = new Bingkuai[n];
long int Disum = 0;//
for (int i = 0; i < n; i++)
{
cin >> tem[i].Ti >> tem[i].Di;
Disum += tem[i].Di;//把每个的融化时间累加在一起
}
sort(tem, tem + n, cmp);//用sort进行排序
long long int sum = 0;//累加融化的数
for (int i = 0; i < n; i++)
{
sum += tem[i].Ti * (Disum - tem[i].Di);
Disum -= tem[i].Di;
/*for (int j = i+1; j < n; j++)//用这个方法会导致时间超时,所以使用了Disum来保存所有融化的时间
{
sum += tem[i].Ti * tem[j].Di;
}*/
}
cout << sum;
delete[]tem;
return 0;
}