10/14程式

mail@pastecode.io avatar
unknown
plain_text
a year ago
5.1 kB
2
Indexable
Never
#include<iostream>
using namespace std;

int main()
{
	int type = 0;  //車輛的種類 
	int stationNum = 0;  //場站數量 
	float RateDecline = 0;  //在場站本身的稼動率下降程度 
	float firstRateDecline = 0;  //距離場站 1 到 300 公尺的稼動率下降程度 
	float secondRateDecline = 0;  //距離場站 301 到 500 公尺的稼動率下降程度 
	float thirdRateDecline = 0;  //距離場站 501 到 1000公尺 的稼動率下降程度 
	bool check = true;
	
	int* charge = new int [type];  //各車型的每小時收費
	int* carNum = new int [type];  //各車型的車輛數 
	int* currentstation = new int [stationNum];
	int* stationMax = new int [stationNum];  //各場站的車輛最大負荷量 
	int** distance = new int* [stationNum];  //各場站間的距離 
	double** expectRate = new double* [type];  //代表各車種在各場站的預期稼動率 
	int** output = new int* [type];
	
	
	cin >> type >> stationNum >> RateDecline >> firstRateDecline >> secondRateDecline >> thirdRateDecline;
	
	for(int i = 0; i < type; i++)
	{
		cin >> charge[i];
    }
	for(int i = 0; i < type; i++)
	{
		cin >> carNum[i];
    }
	for(int i = 0; i < stationNum; i++)
	{
		currentstation[i] = 0;
		cin >> stationMax[i];
    }  
	
	for(int i = 0; i < type; i++)
	{
		expectRate[i] = new double [stationNum];
		for(int j = 0; j < stationNum; j++)
		{
			cin >> expectRate[i][j];
		}
	}
	
	for(int i = 0; i < stationNum; i++)
	{
		distance[i] = new int [stationNum];
		for(int j = 0; j < stationNum; j++)
		{
			cin >> distance[i][j];
		}
	}
	
	for(int i = 0; i < type; i++)  //初始化要輸出的動態陣列,稍後計算時要存入車輛放在各場站的情形 
	{
		output[i] = new int [stationNum];
		for(int j = 0; j < stationNum; j++)
		{
			output[i][j] = 0;
		}
	}
	
	int revenue = 0;
	int maxvalue = 0;
	int cartype = 0;
	int station = 0;
	
	while(true)
	{
		for(int i = 0; i < type; i++)
		{
			for(int j = 0; j < stationNum; j++)
			{
				int revenue = 0;  //用於計算放各種車在各場站時會造成的收入以及虧損 
				int decline = 0;
				if(currentstation[j] != stationMax[j])  //如果沒有超過該場占最大限制的話,才進行運算 
				{
				    revenue = charge[i]* expectRate[i][j]* 24;  //運算投放在該場站增加的收入 
				
				    for(int k = 0; k < type; k++)  //開始運算其他場站原有汽車的稼動率下降導致的虧損 
				    {
					    for(int m = 0; m < stationNum; m++)
					    {
						    if(distance[j][m] == 0)  //如果是影響到本站的車的話, 用本站的計算方式 
						    {
							    decline += output[j][m]* RateDecline* 24;  
							    cout<<"CHECK 0"<<decline<<endl;
						    }
						    else if(0 < distance[j][m] < 301)  //如果是影響到第一層的車,用第一層的計算方式 
						    {
							    decline += output[j][m]* firstRateDecline* 24;
							    cout<<"CHECK 1"<<decline<<endl;
						    }
						    else if(300 < distance[j][m] < 501)  //如果是影響到第二層的車,用第二層的計算方式 
						    {
							    decline += output[j][m]* secondRateDecline* 24;
							    cout<<"CHECK 2"<<decline<<endl; 
						    }
						    else if(500 < distance[j][m] < 1001)  //如果是影響到第三層的車,用第三層的計算方式 
						    {
							    decline += output[j][m]* thirdRateDecline* 24;
							    cout<< "CHECK 3" <<decline <<endl;
						    }
						
					    }
					
					    cout<<"CHECKDECLINE"<<decline<<endl;
				    }
				
				if(revenue - decline > maxvalue)  //如果收入減虧損大於最大收益的話記錄下該投放的車種編號,以及投放場站的編號 
				{
					maxvalue = revenue - decline;
					cartype = i;
					station = j;
					cout << "MAXVALUE"<< maxvalue << endl;
				}
				}
				
			}
		}
		
		for(int i = 0; i < stationNum; i++) //檢查每一個場站的現狀,避免超過最大限制
		{
			if(i == station)
			{
				currentstation[i] ++;
			}
		}
		
		if(maxvalue > 0)  //如果有最大收益的話,把庫存的車種減一,並把場站的車輛數加一 
		{
			carNum[cartype] --;
			output[cartype][station] ++;
			currentstation[station] ++;
			maxvalue = 0;  //將最大收益歸零,以重新計算 
		}
		
		else if(maxvalue == 0)  //如果找不到最大收益了,就將 check 改為 false 結束 while 迴圈 
		{
			break;
		}
		
		
	}
	
	
	
	for(int i = 0; i < type; i++)  //最後輸出各車種在各場站投放量 
	{
		for(int j = 0; j < stationNum; j++)
		{
			if(j == stationNum - 1)
			{
				cout << output[i][j] << endl;
			}
			else
			{
				cout << output[i][j] << ",";
			}
		}
	} 
	
	
	//清除動態陣列空間 
	for(int i = 0; i < type; i++)
	{
		delete[] expectRate[i];
	}
	delete[] expectRate;
	delete[] charge;
	delete[] carNum;
	delete[] stationMax;
	charge = carNum = stationMax = nullptr;
	expectRate = nullptr;
	
	return 0;
 }