Lecture Sleep(尺取)
阿新 • • 發佈:2018-06-23
script desc 很難 namespace names scanf 使用 algo 整數
輸入的第一行包含兩個整數n和k(1≤k≤n≤105) - 以分鐘為單位的講座持續時間以及可讓Mishka保持清醒狀態的分鐘數。
輸入的第二行包含n個整數a1,a2,... an(1≤ai≤104) - 講師在第i分鐘講述的定理數。
輸入的第三行包含n個整數t1,t2,... tn(0≤ti≤1) - 講座第i分鐘Mishka行為的類型。
Description
你的朋友Mishka和你參加一個微積分講座。講座持續n分鐘。講師在第i分鐘講述ai個定理。 米什卡真的對微積分很感興趣,盡管在演講的所有時間都很難保持清醒。給你一個米什卡行為的數組t。如果Mishka在演講的第一分鐘睡著了,那麽ti將等於0,否則它將等於1.當米什卡醒來時,他寫下講師所講述的所有定理 。否則,他什麽都不寫。 你知道一些方式讓Mishka直線醒過來持續k分鐘。但是,您只能使用一次。你可以在1和n - k + 1之間的任何一分鐘開始使用它。如果你在一分鐘內使用它,那麽Mishka會在幾分鐘內醒來,並且會寫下講師所講的所有定理。 你的任務是計算Mishka能夠記下的最大定理數,如果你只用一次技巧來喚醒他。Input
Output
只打印一個整數 - 只用一次技巧來喚醒Mishka,他可以記下的定理的最大數量。
Sample Input
Input
6 3 1 3 5 2 5 4 1 1 0 1 0 0
Output
16
1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 int main() 5 { 6 int n,k,sum=0,tmp=0,ans=-1,x,j,i; 7 int a[100010]; 8 int vis[100010]; 9 scanf("%d%d",&n,&k); 10 for(i=0;i<n;i++) 11 { 12 scanf("%d",&a[i]); 13 } 14 for(i=0;i<n;i++) 15 { 16 scanf("%d",&vis[i]); 17 if(vis[i])///只要是醒著的時候都能記住定理 18 { 19 sum=sum+a[i]; 20 } 21 } 22 for(i=0;i<k;i++) 23 { 24 if(!vis[i]) 25 { 26 tmp=tmp+a[i];///tmp儲存的是使用某種方法之後能記住的定理的增量 27 } 28 } 29 i=0; 30 j=i+k-1;///以使用某種方法的作用時間作為尺取的尺度 31 while(1) 32 { 33 ans=max(ans,sum+tmp); 34 if(!vis[i]) 35 { 36 tmp=tmp-a[i]; 37 } 38 i++; 39 j++; 40 if(j==n)///尺取到頭就要終止遍歷 41 { 42 break; 43 } 44 if(!vis[j]) 45 { 46 tmp=tmp+a[j]; 47 } 48 } 49 printf("%d\n",ans); 50 return 0; 51 }
Lecture Sleep(尺取)