1. 程式人生 > 實用技巧 >貪心演算法--危險的實驗

貪心演算法--危險的實驗

> 問題 A: 危險的實驗
時間限制: 1 Sec 記憶體限制: 128 MB
[提交] [狀態]
題目描述
小明最近在上化學課,他需要使用到 n 種化學物質來進行他的實驗。在做實驗的時候, 他需要將所有化學物質放在桌面上,按次序排成一條直線。
然而每一種化學物質都是危險品,對於第 i 個化學物質,如果有另外一個化學物質距離 它的距離小於 ai,那麼就會發生爆炸。
小明想知道如果要安全的完成他的實驗,桌子最短可以多短。

輸入
第一行一個整數 n,表示化學物質的個數。
第二行有 n 個整數,第 i 個整數 ai 表示第 i 個化學物質必須與其他化學物質保持的距離。

輸出
輸出一行,包括一個整數,表示能夠讓小明安全完成實驗的桌子最小長度。

注意:物品要安原來的次序擺放。

樣例輸入 Copy
3
3 1 2
樣例輸出 Copy
5
提示
20%的資料,1<=n<=20
50%的資料,1<=n<=100000
100%的資料,1<=n<=1000000,1<=ai<=100000

問題:注意陣列要開的足夠大,而且要解決max引用的方法

#include<iostream> 
#include<algorithm>
using namespace std;

int main()
{  
	long n,i,sum=0;
	long a[1000001];
	cin>>n;
	for(i=1;i<=n;i++)
		cin>>a[i];
	for(i=1;i<=n-1;i++)
	{
		sum+=max(a[i+1],a[i]);
	}
	cout<<sum<<endl;
	return 0;
}

  

這裡的:VC6編譯錯誤: error C2065: 'max' : undeclared identifier.
解決:
增加一句
#define max(a, b) (((a) > (b)) ? (a) : (b))

#include<iostream> 
#include<assert.h>
#include<cmath>
#include<algorithm>
using namespace std;
#define max(a, b)  (((a) > (b)) ? (a) : (b))

int main()
{  
	long n,i,sum=0;
	long a[1000001];
	cin>>n;
	for(i=1;i<=n;i++)
		cin>>a[i];
	for(i=1;i<=n-1;i++)
	{
		sum+=max(a[i+1],a[i]);
	}
	cout<<sum<<endl;
	return 0;
}

  

再執行就解決了

下面是long 的相關知識
1.
long long 和 unsigned long long 是 C99 特有的。
2.
unsigned int 0~4294967295
int -2147483648~2147483647
unsigned long 0~4294967295
long -2147483648~2147483647
long long:-9223372036854775808~9223372036854775807