題目
題意:有n個城市排成一排,按遞增給出城市座標,codejan不在任意乙個城市座標上。
問:codejan訪問m個城市最少需要走多少公尺,每個城市可以多次訪問。
解法:首先通過強大的觀察法我們得到最終一定是在兩個城市之間反覆橫跳,或者一次向乙個方向走到m個城市,這兩種方案。
具體如何得到的:
那麼結合我上面分析的幾種情況,得到最終一定是在兩個連續的節點之間反覆橫跳,或者一次都不回頭。
那麼在這裡又有兩種情況,為什麼給組樣例就懂了。
3 4 2
1 10 12
ans = 42
沒錯這個地方我們出發點,選擇回退一格,再重新前進反覆橫跳,為什麼因為我們在回退乙個格仔再回來出發點,花費小於反覆橫跳一次的花費。
當然要選擇最優的答案,那麼這個地方就要特判出發點前面是不是有格仔了,不能再我給的**思路裡面隨便拿索引去找。注意判斷邊界。
給出**,注意記錄在我出發點之前的第乙個城市位置,再列舉反覆橫跳的城市。
#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll ;
#define int ll
#define mod 1000000007
#define gcd __gcd
#define rep(i , j , n) for(int i = j ; i <= n ; i++)
#define red(i , n , j) for(int i = n ; i >= j ; i--)
#define me(x , y) memset(x , y , sizeof(x))
//int lcm(int a , int b)
//ll quickpow(ll a , ll b)return ans;}
//int euler1(int x)if(x>1)ans-=ans/x;return ans;}
//const int n = 1e7+9; int vis[n],prime[n],phi[n];int euler2(int n)for(int j=1;j#define fi first
#define se second
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define pb push_back
#define mp make_pair
#define all(v) v.begin(),v.end()
#define size(v) (int)(v.size())
#define cin(x) scanf("%lld" , &x);
#define endl '\n'
const double esp = 1e-6;
const int n = 1e6+9;
const int maxn = 1e5+9;
int pos[maxn];
void solve()
int sum = 1e18;
rep(i , 1 , n-1)
}else}}
cout << sum << endl;
}signed main()
旅行規劃問題(貪心)
g 先生想獨自駕駛汽車從城市a到城市b。ab距離為dist 千公尺,油箱容量為c公升,每公升油行駛d千公尺,沿途有n個加油站,距a城的距離為si,油價分別為pi。a點時,郵箱為空,起點油價為p。求從a到b的最少費用。不能到達輸出 no solution 輸入 dsit c d p n 接下來n行輸入...
JZOJ 1329 旅行 貪心
description input 輸入檔案的第1行為乙個正整數n,表示了這條路線的長度。第2行有n個正整數,相鄰兩個正整數用空格隔開,描述了a i 這個序列。output 輸出檔案僅包括乙個非負整數,為最小的總體力消耗。注意 答案可能超過2 31 1,請使用int64或者long long型別儲存...
貪心 旅行家的預算
問題描述 乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1 汽車油箱的容量c 以公升為單位 每公升汽油能行駛的距離d2 出發點每公升汽油 p和沿途油站數n n可以為零 油站i離出發點的距離di 每公升汽油 pi i 1,2,n 計算結果四捨五入...