洛谷P3324 SDOI2015 星際戰爭

2022-05-06 20:48:07 字數 1025 閱讀 5311

類似《飛彈防禦塔》,因為題目保證有解,花費時間小於最終答案時一定無法消滅所有敵人,只要花費時間大於等於最終答案都可以消滅所有敵人,答案滿足單調性,考慮二分答案。

二分答案後,轉化為判定性問題。當總時間固定,每件**的總傷害量就確定了。

於是可以按網路流建模:把**和敵人分成兩部分,從源點s向**連邊,容量為該**可以輸出的總傷害量(當前二分到的時間time*該**的dps);每件**向可以它攻擊到的敵人連邊,容量為inf;每個敵人向匯點t連邊,容量為該敵人的生命上限。最後只需判斷最大流是否等於敵人總生命值。

因為時間是小數,**中採用double儲存。最後要求三位小數,也可以把所有資料都乘10000變成整數以提高精度。

注意我的**中n、m、a、b與題目中相反。

#include using namespace std;

const int n=5e5+5,inf=0x3f3f3f3f;

const double eps=1e-4;

double sum,a[n],b[n],val[n];

int n,m,s,t,tot,mp[505][505],d[n];

int top=1,ver[n],nxt[n],head[n];

inline void add(int u,int v,double w)

bool bfs()

} }return false;

}double dfs(int u,double flow)

} return flow-left;

}bool check(double tim)

} for(int i=1;i<=n;++i) add(s,i,tim*a[i]);

for(int i=1;i<=m;++i) add(n+i,t,b[i]);

double res=0;

while(bfs())

return fabs(res-sum)eps)

printf("%.3lf",l);

return 0;

}

洛谷P3324 SDOI2015 星際戰爭 題解

因為本題的時間點較多,不能列舉,但發現有單調性,於是二分答案,二分使用的時間ttt 每個攻擊裝置造成的傷害總量已知,為t b it b i t bi 現在有了傷害總量 生命總量,如何判斷在t tt時間內,機械人是否被全部打死?源點s向所有攻擊裝置連邊,流量為t b it b i t bi 攻擊裝置向...

洛谷P3322 SDOI2015 排序

小a有乙個1 2n的排列a 1.2n 他希望將a陣列從小到大排序,小a可以執行的操作有n種,每種操作最多可以執行一次,對於所有的 i 1 i n 第i中操作為將序列從左到右劃分為2段,每段恰好包括2個數,然後整體交換其中兩段.小a想知道可以將陣列a從小到 大排序的不同的操作序列有多少個,小a認為兩個...

洛谷P2434 SDOI 區間

解題思路 這道題就是簡單的模擬啊。不過愣是沒有模擬對,看來還需要加強 實現能力。先按照左端點從小到大排序,每次驗證當前區間左端點是否大於設定的右端點,如果大於,說明不相交,就輸出設定的左右端點,如果小於等於,說明有相交的部分,不斷更新右端點。include include include inclu...