今天qwb要參加乙個數學考試,這套試卷一共有n道題,每道題qwb能獲得的分數為ai,qwb並不打算把這些題全做完,
他想選總共2k道題來做,並且期望他能獲得的分數盡可能的大,他準備選2個不連續的長度為k的區間,
即[l,l+1,l+2,....,l+k-1],[r,r+1,r+2,...,r+k-1](r >= l+k)。
第一行乙個整數t(t<=10),代表有t組資料接下來一行兩個整數n,k,(1<=n<=200,000),(1<=k,2k <= n)
接下來一行n個整數a1,a2,...,an,(-100,000<=ai<=100,000)
輸出乙個整數,qwb能獲得的最大分數示例1
2631111
1182
-102 -1 -1
23 -1
67
1 #include 2 typedef longlong
ll;3
#define pb push_back
4#define mst(a) memset(a,0,sizeof(a))
5const
int inf = 0x3f3f3f3f;6
const ll linf = 0x3f3f3f3f3f3f3f3f;7
const
double eps = 1e-8;8
const
int mod = 1e9+7;9
const
int maxn = 2e5+10;10
using
namespace
std;
1112
ll sum[maxn];
13 ll max[maxn];//
位置i前,長度為k的區間的最大值
14 ll rmax[maxn];//
位置i後,長度為k的區間的最大值
1516
intmain()
1736
for(int i=k;i<=n;i++)
37 max[i]=max(max[i-1],sum[i]-sum[i-k]);
38for(int i=n-k+1;i>=k;i--)
39 rmax[i]=max(rmax[i+1],sum[i+k-1]-sum[i-1
]);40 ll ans = -linf;
41for(int i=k;i<=n-k;i++)
42 ans=max(ans,max[i]+rmax[i+1
]);43 printf("
%lld\n
",ans);44}
4546
return0;
47 }
數學考試 (字首和 思維)
題目 找出數列中不連續的最大的k區間 和第二大的k區間 這樣的貪心思想是錯誤的。例如7 3 5 6 6 8 10 12 7 不連續的第一大3區間 和第二大分別為 8 10 12 和 5 6 6 這樣計算答案為47.實際上應該選 6 6 8 和 10 12 7 答案為49 以i為分界線,i的左邊包括i...
數學考試 字首和(尺取)
今天qwb要參加乙個數學考試,這套試卷一共有n道題,每道題qwb能獲得的分數為ai,qwb並不打算把這些題全做完,他想選總共2k道題來做,並且期望他能獲得的分數盡可能的大,他準備選2個不連續的長度為k的區間,即 l,l 1,l 2,l k 1 r,r 1,r 2,r k 1 r l k 第一行乙個整...
數學考試dp
來自 先是read 函式,用於快速讀入,比cin快,比printf快 int read ch getchar while ch 0 ch 9 return x f 呼叫函式的時候定義乙個新變數 比如輸入乙個t,表示測試次數 int t t read 接下來是看題幹,兩個不連續的區間 區間長度為k i...