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;	
}
posted @ 2025-04-16 19:43  LteShuai  阅读(11)  评论(0)    收藏  举报