蓝桥杯 算法训练 Airport Configuration c++

蓝桥杯 算法训练 Airport Configuration c++

问题描述

ACM机场是一个本地机场,对于大多数人来说,机场不是他们的终点或起点,而是中转站。机场有一个规划图。到达的大门在机场的北边(相当于空格)。出发的大门在机场的南边(也相当于空格)。两个正对着的大门距离相当于大门间的距离。每一个到达的大门只对应一个城市。每一个出发的大门也是这样。乘客到达的大门对应他们的起始城市,而出发大门对应他们的目标城市。因为这个问题,我们只需考虑转机的乘客。
  转机的乘客会产生机场的交通堵塞。我们已经知道某两个城市之间的平均客流量。用这些信息,有可能能降低交通堵塞。例如,Cx城到Cy城的客流量大,就可以将他们安排得很近,甚至是对位。
  因为花园和商店无法穿越,所以到达门G1和出发们G3(见图)的距离为1+2=3。
  你需要计算几个方案的客流指数。两个大门间的客流指数等于人数乘以距离。而总的客流指数就是所有门之间的客流指数之和。
在这里插入图片描述

输入格式

输入文件有多组测试数据。
  最后一组只有一个0。
  每组测试数据的输入有两部分。先是客流数据,之后是机场布局。
  数据开始时一个n(1<n<25),表示城市数。接下来n行,每行表示一个城市的数据,第i行先是一个整数,表示起始城市,再一个1到n的整数k,表示目标城市数,k对整数,每对描述一个目标城市,第一个数是城市编号j,然后是乘客数目(最多500)从i到j的人数。
  机场布局部分包括1到20个方案。用一个0结束。
  一个方案包括3行。第一行一个数表示编号,第二行是1-n的一个排列,描述到达门对应的城市的排列,第三行用同样的方式描述出发大门。

输出格式

对于每个测试数据,输出包括一个表格,表示方案编号和客流指数,按照客流指数升序输出。若客流指数相同,则编号小的排在前面。见样例。注意方案编号右对齐,而客流指数左对齐。(样例输出前面4个空格,后面9个空格,然后没有空格,详见未格式化的试题。

样例输入

3
1 2 2 10 3 15
2 1 3 10
3 2 1 12 2 20
1
1 2 3
2 3 1
2
2 3 1
3 2 1
0
2
1 1 2 100
2 1 1 200
1
1 2
1 2
2
1 2
2 1
0
0
样例输出
Configuration Load
2 119
1 122
Configuration Load
2 300
1 600

感觉这题不是很难,就是很讨厌,输入输出很绕脑袋,所以后面加了注释,可以根据注释来看代码
emmm这是我们测试我唯一做出来的题了 别问,就是菜
请各位大佬批评指正 互相学习相互进步

#include<math.h>
#include<iostream>
#include<cstdio> 
#include<string.h>
#include<algorithm>
using namespace std;
struct a{
	int vnum;
	int v[26][2]  ;  //1 目标城市,2目标城市人流量 
}city[26];

int main()
{
	int l[21];//方案的客流 
	int i,j;
	int n;//城市数; 
	int a,b,c,d,e;
    while(cin>>n)                             //n 城市数   
    {
    	if(n==0) break;
    	memset(city,0,sizeof(city));
		memset(l,0,sizeof(l));
    	for(i=0;i<n;i++)                  //0-n     
    	{
    		cin>>a>>b;	
			city[a].vnum=b;					//第a(输入的数字) 个城市有 b(输入的数字) 目标城市 
    		for(j=0;j<b;j++)
    		{
    			cin>>d>>e;
    			city[a].v[j][0]=d;			//第a(输入的数字)个城市的第0个目标城市是d 
    			city[a].v[j][1]=e;			//第a(输入的数字)个城市到第0个目标城市的人流量是e 
    		}
    	}
    	int fangan[2][n]; 					//方案的情况; fangan[0][a]  城市a的到达位置    fangan[1][a]   城市a的出发位置 
    	memset(fangan,0,sizeof(fangan)); 
    	int h=0;
    	int nh=0;
    	for(;;)
    	{
    		nh=h+1;
    		cin>>h;                         //方案编号 
    		if(h==0) break;	
    		for(i=0;i<n;i++)
    		{
    			cin>>a;
				fangan[0][a]=i;	 		// 城市a的到达位置位于第i个 
    		}
    		for(i=0;i<n;i++)
    		{
    			cin>>a;
				fangan[1][a]=i;	 		// 城市a的出发位置位于第i个 
    		}
    		
    		for(i=1;i<=n;i++)            //城市的编号与输入一致,所以需要从1-n; 
    		{
    			for(j=0;j<city[i].vnum;j++)      //目标城市从编号0开始存储,人流等于(i城市到达位置-a城市的目标城市b的出发位置+1 ) *j城市到b城市人流量 
				{
					int ans;
					ans=abs(fangan[0][i]-fangan[1][city[i].v[j][0]]);
    			l[h]=l[h]+((ans+1)*city[i].v[j][1]);
    		/*	cout<<i<<"城市的到达位置:"<<fangan[0][i]<<endl;
    			cout<<"目标城市:"<<city[i].v[j][0]<<endl;
    			cout<<"目标城市的出发位置:"<<fangan[1][city[i].v[j][0]]<<endl;
				cout<<"目标城市人流:"<<city[i].v[j][1]<<endl;
    			cout<<"l["<<h<<"]="<<l[h]<<endl; */
    			
    		}
    	}
	} 
 		int min=0x7fffffff;
 		//cout<<"nh"<<"="<<nh<<endl;
 		cout<<"Configuration Load"<<endl;
    	for(i=1;i<nh;i++)
    	{
    	for(int k=1;k<nh;k++)
    	{
    	//	cout<<"比较之前:   l"<<k<<"="<<l[k]<<endl;
    	//	cout<<"        man"<<"="<<min<<endl;
    		if(l[k]<min)
    		{
    			min=l[k];
    			j=k;
    		}
    	}
    	    printf("%d %9d\n", j, min);
    		l[j]=0x7fffffff;
    		min=0x7fffffff;
    	}
}
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值