- 会和
可以直接遍历
学习一下二分
- 7的倍数
k = (j + nums[i]) % 7 < 0 ? (j + nums[i]) % 7 + 7 : (j + nums[i]) % 7
dp[i][k]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn= 1e6+7 ;
const int inf = 0x3f3f3f3f;
int n , a[maxn];
int dp[maxn][10];
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i ++){
scanf("%d",&a[i]);
}
memset(dp , -inf , sizeof(dp));
dp[0][0] = 0;
for(int i = 1; i <= n; i ++){
for(int j = 0; j < 7; j ++){
dp[i][j] = max(dp[i][j] , dp[i - 1][j]);
dp[i][j] = max(dp[i][j] , dp[i - 1][((j - a[i]) % 7 + 7) % 7] + a[i]);
//printf ("%d %d %d\n",i , j , dp[i][j]);
}
}
printf ("%d\n",dp[n][0]);
}
- 中位数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn= 1e6+7 ;
const int inf = 0x3f3f3f3f;
int n , a[maxn];
priority_queue<int>q1,q2;
void init(){
while(q1.size()) q1.pop();
while(q2.size()) q2.pop();
}
void add(int now){
if(q2.size() == 0){
q2.push(-now);
return ;
}
if(now >= -q2.top()){
q2.push(-now);
if(q2.size() > q1.size() + 1){
int x = q2.top();
q2.pop();
q1.push(-x);
}
}
else{
q1.push(now);
if(q1.size() > q2.size()){
int x = q1.top();
q1.pop();
q2.push(-x);
}
}
}
int main(){
scanf("%d",&n);
ll ans = 0;
for(int i = 1; i <= n; i ++){
scanf("%d",&a[i]);
ans += a[i];
}
for(int l = 1; l <= n; l ++){
init();
add(a[l]);
for(int r = l + 1;r <= n; r ++){
add(a[r]);
if((r - l + 1) % 2){
ans -= q2.top();
}
}
}
printf ("%lld\n",ans);
}