🚀欢迎来到本文🚀
🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。
🏀个人主页:@陈童学哦`CSDN
💡所属专栏:PTA
🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝
 ⛱️刷题的当下应是享受的!望与诸君共勉!🏄♂️

 
题目汇总
- 题解
- L2-001 紧急救援
- L2-002 链表去重
- L2-003 月饼
 
- 写在最后
题解
L2-001 紧急救援
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
输入格式:
 输入第一行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0 ~ (N−1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。
第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。
输出格式:
 第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。
输入样例:
 4 5 0 3
 20 30 40 10
 0 1 1
 1 3 2
 0 3 3
 0 2 2
 2 3 2
 输出样例:
 2 60
 0 1 3
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,c1,c2;
int dis[510],weight[510],e[510][510],num[510],w[510],pre[510];
bool visited[510];
const int inf=0x3f3f3f3f;
void printPath(int v)
{
	if(v==c1)
	{
		printf("%d",v);
		return;
	}
	printPath(pre[v]);
	printf(" %d",v);
}
int main()
{
	scanf("%d%d%d%d",&n,&m,&c1,&c2);
	for(int i=0;i<n;i++)
		scanf("%d",&weight[i]);
	fill(e[0],e[0]+510*510,inf);
	fill(dis,dis+510,inf);
	int a,b,c;
	for(int i=0;i<m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		e[a][b]=e[b][a]=c;
	}
	dis[c1]=0;
	w[c1]=weight[c1];
	num[c1]=1;
	for(int i=0;i<n;i++)
	{
		int u=-1,minn=inf;
		for(int j=0;j<n;j++)
		{
			if(visited[j]==false&&dis[j]<minn)
			{
				u=j;
				minn=dis[j];
			}
		}
		if(u==-1)
			break;
		visited[u]=true;
		for(int v=0;v<n;v++)
		{
			if(visited[v]==false&&e[u][v]!=inf)
			{
				if(dis[u]+e[u][v]<dis[v])
				{
					dis[v]=dis[u]+e[u][v];
					num[v]=num[u];
					w[v]=w[u]+weight[v];
					pre[v]=u;
				}
				else if(dis[u]+e[u][v]==dis[v])
				{
					num[v]=num[v]+num[u];
					if(w[u]+weight[v]>w[v])
					{
						w[v]=w[u]+weight[v];
						pre[v]=u;
					}
				}
			}
		}
	}
	printf("%d %d\n",num[c2],w[c2]);
	printPath(c2);
}
L2-002 链表去重
给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。
输入格式:
 输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤10
 5
 ,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 −1 来表示。
随后 N 行,每行按以下格式描述一个结点:
地址 键值 下一个结点
 其中地址是该结点的地址,键值是绝对值不超过10
 4
 的整数,下一个结点是下个结点的地址。
输出格式:
 首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。
输入样例:
 00100 5
 99999 -7 87654
 23854 -15 00000
 87654 15 -1
 00000 -15 99999
 00100 21 23854
 输出样例:
 00100 21 23854
 23854 -15 99999
 99999 -7 -1
 00000 -15 87654
 87654 15 -1
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node{
	int k;
	int next;
	
}d[maxn];
vector<int>ans1;
vector<int>ans2;
int vis[maxn];
int main()
{
	memset(vis,0,sizeof(vis));
	int head;
	int n;
	cin>>head>>n;
	int x;
	for(int i=0;i<n;i++)
	{
		cin>>x;
		cin>>d[x].k>>d[x].next;
	}
	for(int i=head;i!=-1;i=d[i].next)
	{
		int c=abs(d[i].k);
		if(vis[c]==0)
		{
			vis[c]=1;
			ans1.push_back(i);
		}
		else
		{
			ans2.push_back(i);
		}
	}
	for(int i=0;i<ans1.size();i++)
	{
		if(i==ans1.size()-1)
			printf("%05d %d -1\n",ans1[i],d[ans1[i]].k);
		else
			printf("%05d %d %05d\n",ans1[i],d[ans1[i]].k,ans1[i+1]);
	}
	for(int i=0;i<ans2.size();i++)
	{
		if(i==ans2.size()-1)
			printf("%05d %d -1\n",ans2[i],d[ans2[i]].k);
		else
			printf("%05d %d %05d\n",ans2[i],d[ans2[i]].k,ans2[i+1]);
	}
}
L2-003 月饼
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 = 94.5(亿元)。
输入格式:
 每个输入包含一个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N 表示月饼的种类数、以及不超过 500(以万吨为单位)的正整数 D 表示市场最大需求量。随后一行给出 N 个正数表示每种月饼的库存量(以万吨为单位);最后一行给出 N 个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出格式:
 对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后 2 位。
输入样例:
 3 20
 18 15 10
 75 72 45
 输出样例:
 94.50
AC代码:
#include<bits/stdc++.h>
using namespace std;
struct node{
	double num;
	double price;
	double dj;
}moon[1001];
bool cmp(node a,node b)
{
	return a.dj>b.dj;
}
int main()
{
	int n,m;
	cin>>n>>m;
	double sum=0;
	for(int i=1;i<=n;i++)
	{
		cin>>moon[i].num;
	}
	for(int i=1;i<=n;i++)
	{
		cin>>moon[i].price;
		moon[i].dj=moon[i].price/moon[i].num;
	}
	sort(moon+1,moon+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		if(moon[i].num>=m)
		{
			sum+=m*moon[i].dj;
			break;
		}
		else
		{
			m-=moon[i].num;
			sum+=moon[i].dj*moon[i].num;
			
			
		}
	}
	printf("%.2lf",sum);
	
}
写在最后
🍉🍉🍉不必偏执于未知的真实,身处的当下即是意义和真实,爱才是解题的答案,也是刻画人生色彩的笔尖,耐心的走下去,总会遇到你爱的人和爱你的人。
🍁🍁🍁好啦,本文的内容就到此结束啦,我们下期再见哦!另外在祝各位小伙伴们要天天开心哦!
 🍂🍂🍂如果你觉得本文对你有帮助的话,还请不要吝惜您的三连哦!您的支持就是我创作的最大动力!!爱你们💕💕💕
 

















