hdu 6047

题意:A,B2个数列,让我们求A的后n个数字最大和,我们在B中挑一个数字c,对于Ac到A这个数列末尾的最大值放到A的末尾,c不可重复利用

思路:贪心,我们肯定是从最前面开始,最大的值放进来,对后面好处也更大

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const ll mod=1e9+7;
 5 const int N=250004;
 6 
 7 int a[N],b[N];
 8 int c[N];
 9 
10 int main(){
11     int n;
12     while(scanf("%d",&n)!=EOF){
13         int x;
14     memset(c,0,sizeof(c));
15         for(int i=1;i<=n;i++){
16             scanf("%d",&x);
17             a[i]=x-i;
18         }
19         for(int i=1;i<=n;i++) scanf("%d",&b[i]);
20         sort(b+1,b+1+n);
21         for(int i=n;i>=1;i--){
22             c[i]=max(c[i+1],a[i]);
23         }
24         int  sum=0;
25         int  Max=-1;
26         for(int i=1;i<=n;i++){
27             int kk=max(c[b[i]],Max);
28             sum=(sum+kk)%mod;
29             Max=max(Max,kk-n-i);
30         }
31         printf("%d\n",(sum+mod)%mod);
32     }
33     return 0;
34 }

 

posted on 2017-07-27 19:40  hhhhx  阅读(270)  评论(0编辑  收藏  举报

导航