百度的新大廈

百度之星2012 J
描述 

繼百度搜索框大廈之後,百度又於2012年初在深圳奠基了新的百度國際大廈,作爲未來百度國際化的橋頭堡。不同於百度在北京的搜索框大廈,新的百度國際大廈是一棟高樓,有非常多的樓層,讓每個樓中的電梯都能到達所有樓層將是一個極爲不明智的設計。因此,設計師給出了一個特別的設計——一共大廈有m個電梯,每個電梯只有兩個按鈕,(針對第i個電梯)兩個按鈕分別可以使電梯向上或ui層向下一定di層;百度國際大廈很高,你永遠到不了頂層,也就是說電梯沒有上限,但是,電梯不可以鑽入地下,也就是說是有下限的。我們將每層樓用整數標記,爲了體現IT公司的特質,我們以0作爲地面這一層的標記。 如果你某天在百度國際大廈的0層,僅可以選擇m個電梯中的一個乘坐(不可以中途換電梯),請你計算,你按電梯中的按鈕n次後(每次兩個按鈕選一個按),可以到達的最低樓層數。

 輸入 

輸入的第一行包括兩個整數,分別爲n和m(1 ≤ n ≤ 1,000,000,1 ≤ m ≤ 2,000),表示按電梯按鈕的次數和大廈中的電梯數量。接下去的m行,每行 包括2個由空格分割的數字,分別表示了提供的m個電梯中的某一個的上行按鈕上升一次的層數ui和下行按鈕下降一次的層數di(1 ≤ ui,di ≤ 1000) 

輸出 

輸出一個正整數,表示選用m個電梯中的一個後,在電梯裏按電梯中的按鈕n次後(每次兩個按鈕選一個按),可以到達的最低樓層數。 樣例輸入 

10 3 

15 4 

15 12

 7 12

 樣例輸出 

13

 提示 

按鈕上的移動樓層數無法改變,比方說從8層向下9層是不可行的 

---------------------------------------------------------------------------------------------------------

//本題的題解沒有看懂,我自己用貪心算法寫了一遍,核心是:每次到達範圍內的最小值,即--能往下走就往下走

#include<iostream>
#include<fstream>
#include<cstdlib>
using namespace std;

ifstream fin("C:\\data26.in");



int main()
{
    long long n;
    int m;
    int up[2001],down[2001];
    int min[2001];
	int minfloor=32767;
	fin>>n>>m;
	for(int i=1;i<=m;++i)
		fin>>up[i]>>down[i];
	for(int i=1;i<=m;++i)
	{
		for(long long j=0;j<n;++j)
		{
			if(min[i]-down[i]>=0)
				min[i]-=down[i];
			else
				min[i]+=up[i];
		}
		if(min[i]<minfloor)
			minfloor=min[i];
	}
	cout<<minfloor<<endl;
	system("pause");
	return 0;
}


//本題的題解爲

#include <cstdio>
#include <limits>
#include <algorithm>
#include <iostream>
using namespace std;
int core(int u, int d, int N)
{
const long long m = (static_cast<long long>(N)*u-1LL)/(u+d);
const long long n = N - m;
int r = u*n - m*d;
return r;
}
int main(){
int n,m;
int r=numeric_limits<int>::max();;
fin>>n>>m;
while(m--){
int s,x;
int temp;
fin>>s>>x;
temp=core(s,x,n);
if(temp<r) r=temp;
}
cout<<r<<endl;
return 0;
}



//經測試,兩個解法運行時間差不多
//雖然沒看懂題解寫了些什麼,不過看到這個題解我發現我的解法可以修改一下,以節約時間和空間

//修改後的爲

#include<iostream>
#include<fstream>
#include<cstdlib>
using namespace std;
#include<ctime>

ifstream fin("C:\\data26.in");



int main()
{
    long long n;
    int m;
    int up[2001],down[2001];
    int min[2001];
	int minfloor=32767;
	fin>>n>>m;
	for(int i=1;i<=m;++i)
		fin>>up[i]>>down[i];
	for(int i=1;i<=m;++i)
	{
		for(long long j=0;j<n;++j)
		{
			if(min[i]-down[i]>=0)
				min[i]-=down[i];
			else
				min[i]+=up[i];
		}
		if(min[i]<minfloor)
			minfloor=min[i];
	}
	cout<<minfloor<<endl;
	cout<<(double)clock()/CLOCKS_PER_SEC<<endl;
	system("pause");
	return 0;
}

//和題解的時間差不多了
發佈了48 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章