SDOI2015第1輪第2試 星際戰爭

2021-07-08 15:50:05 字數 1717 閱讀 1804

2023年,在銀河系的某星球上,x軍團和y軍團正在激烈地作戰。在戰鬥的某一階段,y軍團一共派遣了n個巨型機械人進攻x軍團的陣地,其中第i個巨型機械人的裝甲值為ai。當乙個巨型機械人的裝甲值減少到0或者以下時,這個巨型機械人就被摧毀了。x軍團有m個雷射**,其中第i個雷射**每秒可以削減乙個巨型機械人bi的裝甲值。雷射**的攻擊是連續的。這種雷射**非常奇怪,乙個雷射**只能攻擊一些特定的敵人。y軍團看到自己的巨型機械人被x軍團乙個乙個消滅,他們急需下達更多的指令。為了這個目標,y軍團需要知道x軍團最少需要用多長時間才能將y軍團的所有巨型機械人摧毀。但是他們不會計算這個問題,因此向你求助。

第一行,兩個整數,n、m。

第二行,n個整數,a1、a2…an。

第三行,m個整數,b1、b2…bm。

接下來的m行,每行n個整數,這些整數均為0或者1。這部分中的第i行的第j個整數為0表示第i個雷射**不可以攻擊第j個巨型機械人,為1表示第i個雷射**可以攻擊第j個巨型機械人。

對於30%的資料,1<=n, m<=5;

對於全部的資料,1<=n, m<=50,1<=ai<=105,1<=bi<=1000,輸入資料保證x軍團一定能摧毀y軍團的所有巨型機械人。

就是有m個機關槍,n個機器,每個機關槍每秒可以造成ai點傷害。

每個機器也有bi點體力值,問多少秒後可以把全部的機器乾掉。每個機關槍有指定的機器打。

秒數有可能為小數。

我們先來分析題目要求什麼?

其實就是要求每個機關槍打的最大值最小。

也就是二分。

現在我們考慮如何判定。

其實也很簡單,我們把這個問題轉換成網路流的問題。

從源點連到每個機關槍連容量為當前二分的mid*a[i]

然後每個機關槍向它們可以打的機器連maxlongint

機器再向匯點連bi。

最後只用判斷最大流是否為∑b

i 就行了。

#include

#include

#include

#include

#include

#include

#define maxlongint 2147483647

using

namespace

std;

const

int n=60,m=10000;

const

double eps=0.00001;

int n,m,ai[n],bi[n],b[m],las[m],nex[m],nu,t,x,ma,d[m],a[m];

double mid,f[m],re[m],sum;

void insert(int x,int y,int z)

bool bfs()}}

return d[t];

}double ditch(int x,double y)}}

if (ll1;

return ll;

}bool check(double x)

for(int i=1;i<=m;i++)

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

for(int i=1;i<=m;i++)

for(int j=1;j<=n;j++)

double l=0,r=sum/ma;

while(r-l>eps)

printf("%.6lf\n",l);

}

第1章 快速入門 2

1.3 關於注釋 注釋不會增加可執行程式的大小,編譯器會忽略所有的注釋。c 中有單行注釋和成對注釋兩種型別的注釋。單行注釋以雙斜線 開頭,行中處於雙斜線右邊的內容是注釋,被編譯器忽略。另一種界定符,注釋對 是從c語言繼承過來的。這種注釋以 開頭,以 結尾。編譯器把落入注釋對 之間的內容作為注釋。th...

第1次上機實驗 2

一 問題及 檔名稱 輸入3個整數,輸出其中的最大值 作 者 呂鵬 完成日期 2016 年 3 月 10 日 版 本 號 v1.0 對任務及求解方法的描述部分 輸入描述 無 問題描述 我的第1次上機實驗 2 程式輸出 輸出其中的最大值 問題分析 略 演算法設計 略 includeusing names...

C 第2次實驗(1)

一.問題及 檔名稱 c 第2次實驗 1 作 者 楊昌程 完成日期 2016年 3 月 24 日 版 本 號 v1.0 對任務及求解方法的描述部分 判斷體重的健康情況 輸入描述 輸入體重和身高 問題描述 體重是否超重 程式輸出 超重,正常或超輕 問題分析 略 演算法設計 三.心得體會 能較快的編寫出程...