2017.1.24
重新做了一遍這個題目。
三個杯子,總水量是一樣的,只需要記錄前兩個杯子來作為狀態來判重即可。
然後他要求總到水量最小,直接貪心就好了,優先選取總水量最小的,用優先佇列即可。
然後找乙個最接近d的答案即可。
#include #include #include #include using namespace std;
struct node
bool operator < (const node& rhs) const
}st;
priority_queueq;
bool vis[207][207];
int all;
int ans1,ans2;
int a,b,c,d;
int va[5];
void bfs()}}
for (int i = 0; i < 3; ++i)
else
if (!vis[ne.v[0]][ne.v[1]])}}
}}
}int main()
return 0;
}
完全仿照紫書上來寫的!
書中大體思路是:
用ans來記錄答案,不斷取最小值來更新!
用vis來表示是否訪問過,之所以是二維陣列,是因為總水量是固定的,兩個杯子確定,第三個杯子自然也就確定,兩個狀態足矣!
用結構體表示每乙個狀態!其中包括每個杯子的水量!u.wat,還有dist 為到目前這個狀態總的取水量!
然後用優先佇列不斷倒水,
有乙個技巧,**中先算出需要倒的水量,然後再計算!這樣結果不會出現負值,兩個情況都考慮到了!很巧妙!
int m = min(cup[j],u.wat[i]+u.wat[j]) - u.wat[j];//m 為需要倒水的量,這樣寫 不會出現負值!
最後注意結果可能會有0就行了!
#includeusing namespace std;
struct node
};const int maxn = 200 + 10;
int cup[3],vis[maxn][maxn],ans[maxn];//vis之所以是二維陣列,是因為總水量是固定的,兩個杯子確定,第三個杯子自然也就確定,兩個狀態足矣!
void update_ans(const node &u)
}void solve(int a,int b,int c,int d)}}
while(d >= 0)
--d;
}}int main()
return 0;
}
例題 油田(UVa 572)
輸入乙個m行n列的字元矩陣,統計字元 組成多少個八連塊。如果兩個字元 所在的格仔相鄰 橫豎或者對角線方向 就說他們屬於同乙個八連塊。sample input 1 1 3 5 sample output01 分析 dfs基礎題,典型題。用dfs找聯通塊 從每個 格仔出發,遞迴遍歷它周圍的 格仔。每次訪...
UVa156Map入門例題
include include include include includeusing namespace std vectorwords mapcnt string repe const string s for int i 0 i1.輸入的字串將其先進行標準轉換後存放在map中 a.轉換成小寫...
凸包例題 UVa 10652
題意 有n塊矩形木板,你的任務是用乙個面積盡量小的凸多邊形把它們包起來,並計算出木板佔整個包裝面積的百分比。第一行輸入的是資料的組數,t 50 每組資料第一行為木板個數,n 600 以下n行每行五個實數,x,y,w,h,j。j是順時針旋轉的角度。sample input 4 7.5 6 3 0 8 ...