A比赛
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int maxn=550;
int n,k;
int a[maxn];
ll sum[maxn*maxn];
bool cmp(ll a,ll b)
{
return a>b;
}
int main()
{
while(~scanf("%d%d",&n,&k)){
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int tot=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
sum[tot++]=1LL*a[i]+a[j];
}
}
ll ans=0;
sort(sum,sum+tot,cmp);
for(int i=0;i<k;i++){
ans+=sum[i];
}
printf("%lld\n",ans);
}
return 0;
}
B棋盘
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int maxn=100010;
int n,k;
int a[2][maxn];
int b[3][maxn];// 10 01 11
int main()
{
while(~scanf("%d",&n)){
int l=n+1,r=-1;
for(int j=0;j<2;j++){
for(int i=0;i<n;i++){
scanf("%d",&a[j][i]);
if(a[j][i]){
l=min(l,i);
r=max(r,i);
}
}
}
if(l==n+1){
printf("0\n");
continue;
}
//printf("l:%d r:%d\n",l,r);//
b[0][l]=1-a[0][l];
b[1][l]=1-a[1][l];
//b[2][l]=b[0][l]+b[1][l];
//printf("%d %d\n",b[0][l],b[1][l]);//
for(int i=l+1;i<=r;i++){
if(!a[0][i]&&!a[1][i]){
b[0][i]=1+b[0][i-1];
b[1][i]=1+b[1][i-1];
}
else if(!a[0][i]&&a[1][i]){
b[0][i]=1+min(b[0][i-1],b[1][i-1]);
b[1][i]=min(b[0][i],b[1][i-1]);
}
else if(a[0][i]&&!a[1][i]){
b[1][i]=1+min(b[0][i-1],b[1][i-1]);
b[0][i]=min(b[0][i-1],b[1][i]);
}
else{
b[0][i]=b[1][i]=min(b[0][i-1],b[1][i-1]);
}
//printf("i:%d 0:%d 1:%d\n",i,b[0][i],b[1][i]);
}
printf("%d\n",min(b[0][r],b[1][r]));
}
return 0;
}
C子序列子序列子序列
代码来源:https://www.cometoj.com/status/b8168575c045802f9c947fa89a8fa939
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ld;
const int MAXN = 5e3 + 5, MAXM = 2e5 + 5, BOUND = 1e7, MOD = 1e9 + 7, INF = 0x3f3f3f3f, base = 10000;
const ll INFL = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0), eps = 1e-9;
#define mid l + ((r-l)>>1)
#define lson o<<1,l,m
#define rson o<<1|1,m+1,r
#define lc(x) ch[x][0]
#define pii pair<int,int>
#define vi vector<int>
#define RR register int
#define rc(x) ch[x][1]
#define rep(i,a,b) for(RR i=(a);i<=(b);++i)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
int n, m, a[MAXN], f[2][15][MAXN];
inline void add(int &x, int y) {
x += y;
if (x >= MOD)x -= MOD;
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> m;
rep(i, 1, n)cin >> a[i];
int num = 0;
while (m % (1 << num + 1) == 0)num++;
num++;
int cur = 0;
f[0][0][0] = 1;
rep(i, 1, n) {
cur ^= 1;
rep(j, 0, num) {
for (int k = 0; (k << max(j - 1, 0)) < m; k++) {
f[cur][j][k] = f[cur ^ 1][j][k];
}
}
rep(j, 0, num) {
for (int k = 0; (k << max(j - 1, 0)) < m; k++) {
add(f[cur][min(j + 1, num)][(k + a[i]) % (m >> min(j + 1, num) - 1)], f[cur ^ 1][j][k]);
}
}
}
int ans = 0;
rep(i, 0, num)add(ans, f[cur][i][0]);
cout << (ans - 1 + MOD) % MOD << '\n';
return 0;
}