题意: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 ",(sum+mod)%mod); 32 } 33 return 0; 34 }