CodeForces-The Humanoid
题目
这道题 我一开始用dp去写,结果发现一个问题,就是每次到了一个新的n我无法随时把这个最大的当前值取出来,然后就g掉了,后面看了下题解,才知道原来枚举用法就好了。太笨蛋了!!!不过锻炼了我dp


思路
可以发现 一定是绿蓝绿 蓝绿绿 绿绿蓝三种 于是就可以枚举三种情况,但是如何去写的更简便才是一个挑战,很遗憾我写裂开了
我写了半天
还是没写出来
建议以后看到这个重做
for (int j = 1; j <= n; j++) {
while (power <= a[j]) {
if (green == i && blue > 0) {
blue--;
power *= 3;
} else if (green > 0) {
green--;
power *= 2;
} else break;
}
然后就是深搜的写法了
我今天百度了这个深搜
其实这种深搜你只要想好最多深度多少呢其实也就3层 每层n种情况才多大呀
一般来说n是2e5 搜个几百层一千层是没什么的。在256mb的情况下
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int range=2e5+10;
int n;
int k;
int a[range];
int dfs(int num,int g,int b,int power)
{
if(num==n+1)return 0;
if(power<=a[num])
{
int ans1=g?dfs(num,g-1,b,power*2):0;
int ans2=b?dfs(num,g,b-1,power*3):0;
return max(ans1,ans2);
}
else {
return dfs(num+1,g,b,power+a[num]/2)+1;
}
}
void solve()
{
cin>>n>>k;
for (int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+1+n);
cout<<dfs(1,2,1,k)<<endl;
}

浙公网安备 33010602011771号