蓝桥杯练习,身份证排序,搬运冰块

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

remandancy.h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值