題意給你乙個序列a[1...n],你必須修改乙個a[i]為p,使得修改後的序列a的連續最大和最大
其中n<=1000
分析,n非常小,n^2暴力隨便做,不細講
說乙個o(n)的演算法
我們知道o(n)的求連續最大和的演算法
那麼定義l[i], r[i]分別為l[i]以i為結尾的最大連續和,r[i]一i為開頭的連續最大和
由於必須要修改乙個a[i]為p,這個修改後的a[i]可能不包含在連續最大和中,也可能包含在連續最大和中
如果包含,那麼就等價於:max(l[i - 1], 0) + max(r[i + 1], 0) + p
如果不包含,那麼就計算1...n-1的最大l[i], 2...n的最大的r[i]
為什麼是 計算1...n-1的最大l[i], 2...n的最大的r[i] 而不是全部跑一遍
都是少乙個?
因為必須修改a[1...n]中的某乙個元素為p
比如說n = 3 p = -100
a[1...3] =
那麼答案就是20,並非30
總是少乙個的原因就是假設修改的那乙個元素並沒有影響到當前答案
如果修改後的a[i]=p並沒有在最大的連續子段和中,那麼一定在這連續子段和之外,設這個最大連續子段和的子段為a[l...r],一定保證l>1或者r
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include
8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14
15#define dprint(expr) fprintf(stderr, #expr " = %d\n", expr)
1617
using
namespace
std;
1819 typedef long
long
ll;20 typedef pair pii;
2122
const
int n = 1e5 + 7;23
const
int inf = 0x3f3f3f3f;24
const
int mod = 1e9 + 7;25
const
double eps = 1e-6;26
const
double pi = acos(-1.0
);27
28int
a[n];
29ll l[n], r[n];
3031
int main(void)48
for (int i = 1; i < n; ++i)
51for (int i = n; i > 1; --i)
54 printf("
%i64d\n
", ans);55}
56return0;
57 }
貪心演算法(hdu 4442 hdu 3183)
題目 題意 乙個人去做運動,給定每項運動的初始等待時間和增長等待時間,一等完該運動的等待時間就相當於完成該項運動,即不考慮做運動的時間,求完成所有運動最短要多少時間。題解 貪心,考慮兩種運動,初始等待時間為a1,a2,增長等待時間為b1,b2,只會發生兩種情況,先做第乙個運動和先做第二個,先做第乙個...
hdu 1009 貪心演算法
老鼠準備了m磅的貓糧準備和守鼠糧的貓交換 貓守著n個倉庫,其中存放著不同數量的鼠糧,不同的倉庫交換其中的鼠糧所需要的貓糧是不一樣的,所以每個倉庫有兩個資料 1 鼠糧的重量 2 換取這些鼠糧所需要的貓糧。例如 第乙個倉庫 18 4 就表明老鼠用4磅的貓糧可換取18磅的鼠糧。但是如果老鼠沒有4磅的貓糧,...
HDU2037貪心演算法
problem description 今年暑假不ac?是的。那你幹什麼呢?看世界盃呀,笨蛋!確實如此,世界盃來了,球迷的節日也來了,估計很多acmer也會拋開電腦,奔向電視了。作為球迷,一定想看盡量多的完整的比賽,當然,作為新時代的好青年,你一定還會看一些其它的節目,比如新聞聯播 永遠不要忘記關心...