【csust】寻宝(贪心,思维)
生活随笔
收集整理的這篇文章主要介紹了
【csust】寻宝(贪心,思维)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題干:
Description
在一維坐標軸上有許多寶藏,總共n種寶藏,每種寶藏有k個?,F在共k個人尋寶,k個人初始位置可以位于任意點。但是每人需要按指定順序撿起寶藏(1->2->3->...->n,先撿第1種,再撿第2種。。。最后撿第n種寶藏,每種寶藏撿起一個)。每個人要撿起n個寶藏。現在你自己規劃好k個人的初始位置與尋寶路線(一個寶藏只能被一個人撿起),求k個人所走路程的和最短是多少。
Input
第一行兩個整數:n,k接下來n行,每行k個整數x,表示寶藏在一維坐標軸上的位置。
(1<=n<=100)
(1<=k<=8)
(-1000,000,000<=x<=1000,000,000)
Output
輸出一個數最短的距離和
Sample Input 1?
2 3 -1 1 3 -2 2 4Sample Output 1
3Hint
樣例解釋:
第一個人:從-1到-2
第二個人:從1到2
第三個人:從3到4
解題報告:
? ?貪心發現先對于每一個寶藏的位置排序之后每個人取對應順序上的那個值,得到的一定是最優解。證明也不難,交換證明法就行。
AC代碼:
#include <cstdio> #include <algorithm> using namespace std; #define ll long long struct st {ll pos[10]; } bao[120]; bool cmp(int x,int y) {return x<y; } int main() {int n,k;scanf ("%d%d",&n,&k);for (int i=1; i<=n; i++)for (int j=1; j<=k; j++) scanf ("%lld",&bao[i].pos[j]);for (int i=1; i<=n; i++)sort(bao[i].pos+1,bao[i].pos+k+1,cmp);ll ans=0;for (int i=1; i<=k; i++)for (int j=2; j<=n; j++){ans+=abs(bao[j].pos[i]-bao[j-1].pos[i]);}printf ("%lld\n",ans);return 0; }?
總結
以上是生活随笔為你收集整理的【csust】寻宝(贪心,思维)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: winole.exe - winole是
- 下一篇: 【ZOJ - 3211】Dream Ci