- 会和
可以直接遍历
学习一下二分
- 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);}
