描述
繼百度搜索框大廈之後,百度又於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;
}
//和題解的時間差不多了