Educational Codeforces Round 97 (Rated for Div. 2)部分题解
Problem A
我们构造以l为a,那么转换一下题目的方程,就可以发现,\(2*l>r\)的时候条件一定成立。
Problem B
不知道什么鬼,猜一发就能过了。大概就是连续的0和1的数量取一个max。
Problem C
本来是想贪心的,但是这个题目太难搞了。最后思路还是走向dp,首先我们分析最后的状态一定是所有的菜都被在某一个时间拿走。那么在某时刻拿走当前菜的状态取决于前一盘菜被拿走的时候的状态,于是我们需要枚举前一个菜被拿走的时间,状态转移方程为:\(dp[i][j]=max (dp[i][j],dp[i-1][k]+w)\).
代码实现
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
int dp[maxn][maxn];
int n;
void check_min (int &a,int b) {a=min (a,b);}
int main () {
int t;
scanf ("%d",&t);
while (t--) {
scanf ("%d",&n);
vector <int> v(n+1);
for (int i=1;i<=n;i++) scanf ("%d",&v[i]);
memset (dp,0x7f,sizeof (dp));
for (int i=0;i<=2*n;i++) dp[i][0]=0;
sort (v.begin ()+1,v.end ());
for (int i=1;i<=n;i++)
for (int j=i-1;j<=2*n;j++)
for (int k=j+1;k<=2*n;k++) {
check_min (dp[i][k],dp[i-1][j]+abs (v[i]-k));
}
int ans=0x3f3f3f3f;
for (int i=1;i<=2*n;i++) check_min (ans,dp[n][i]);
printf ("%d\n",ans);
}
return 0;
}