Ban or Pick, What‘s the Trick

Ban or Pick, What’s the Trick

https://codeforces.com/gym/104065/problem/A

记忆化搜索例题,

由于是轮流制,而且轮到A或B时,只能选择ban或者选英雄,那么,如果选肯定优先选己方最大的,如果禁,肯定禁对方最大的,由此,我们需要对两个英雄池进行降序排序。

根据需求我们可得转移方程

对于A希望,拉的分查越大越好

max(选择了英雄,没有选择英雄)

对于B希望,拉的分查越小越好

min(选择了英雄,没有选择英雄)

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
const ll N = 2*1e5+10;
const ll K = 12;
ll dp[N][K][K];
ll a[N/2],b[N/2];
ll n,k;
const ll inf =-(1e17+10);

void init(ll n,ll k){
	for(ll i=0;i<=n;i++){
		for(ll j=0;j<=k;j++){
			for(ll z=0;z<=k;z++){
				dp[i][j][z]=inf;
			}
		}
	}
}

// turn是目前轮流的次数,ta是A队选择了ta个英雄,tb是B队选择了tb个英雄
ll dfs(ll turn,ll ta,ll tb){
	if(turn ==2*n) return 0;
    //记忆化搜索的关键,避免重复计算。使得指数的时间复杂度缩减为O(n);
	if(dp[turn][ta][tb]!=inf) return dp[turn][ta][tb];
    //pa pb 分别表示为确认a目前英雄池判断英雄所在的位置,b也是一样的道理
   	//根究轮次和两队分别选择的英雄数量,判断pa,pb要判断英雄的位置。
	ll pa=turn/2 + ta-tb;
	ll pb=(turn+1)/2+tb-ta;
    
	if(turn%2){
        //轮到B进行选择
		ll res = -inf;
        //如果B能够进行选择英雄
		if(ta+tb<=2*n&&tb<k){
			res = min(res,dfs(turn+1,ta,tb+1)-b[pb+1]);
		}	
        //与B不能够进行选择英雄进行判断
		res = min(res,dfs(turn+1,ta,tb));
        //记住选择
		dp[turn][ta][tb] = res;
		return res;
	}
	else{
        //轮到A进行选择。
		ll res = inf;
        //如果A能够进行选择英雄
		if(ta+tb<=2*n&&ta<k){
			res = max(res,dfs(turn+1,ta+1,tb)+a[pa+1]);
		}	
        //与A不能够进行选择英雄进行判断
		res = max(res,dfs(turn+1,ta,tb));
        //记住选择
		dp[turn][ta][tb] = res;
//		cout<<res<<" "<<turn<<endl;
		return res;
	}
}
signed main(){
	cin>>n>>k;
	for(ll i=1;i<=n;i++) cin>>a[i];
	for(ll i=1;i<=n;i++) cin>>b[i];
	init(n*2,k);
	sort(a+1,a+n+1,greater<ll>());
	sort(b+1,b+n+1,greater<ll>());
	cout<<dfs(0,0,0);
}
### Wine 使用技巧与方法 Wine 是一个开源项目,旨在让 Linux 和其他类 Unix 系统能够运行 Windows 应用程序。它通过模仿 Windows API 来实现这一目标,而无需实际安装 Windows 操作系统。以下是一些关于使用 Wine 的技巧和方法[^1]。 #### 安装应用程序 要安装 Windows 应用程序,用户可以简单地双击 `.exe` 文件,或者在终端中运行 `wine <application_name>.exe`。如果需要更高级的安装选项,可以使用 Winetricks 工具来安装依赖项和库[^2]。 ```bash winetricks vcrun2019 ``` 上述命令将安装 Visual C++ 2019 Redistributable,这是许多现代 Windows 应用程序所必需的。 #### 调整图形设置 某些应用程序可能需要特定的 DirectX 或 OpenGL 设置才能正常运行。可以通过 `winecfg` 工具调整这些设置: ```bash winecfg ``` 在 `Graphics` 标签页中,可以启用或禁用虚拟桌面,并调整分辨率和其他图形相关选项[^3]。 #### 使用前缀隔离环境 Wine 允许创建多个前缀(prefix),每个前缀相当于一个独立的 Windows 环境。这有助于隔离不同应用程序之间的冲突。创建新前缀的方法如下: ```bash WINEPREFIX=~/.new_prefix wineboot --init ``` 然后,在该前缀下运行应用程序时,需指定相同的 `WINEPREFIX` 环境变量。 #### 日志调试 如果某个应用程序无法正常运行,可以启用调试日志以获取更多信息。通过设置 `WINEDEBUG` 环境变量,可以控制输出的日志级别: ```bash WINEDEBUG=+all wine <application_name>.exe ``` 注意,生成的日志文件可能会非常大,因此建议仅在需要时启用此功能[^4]。 #### 性能优化 为了提高性能,可以禁用不必要的功能,例如字体平滑和视觉主题。同样,可以在 `winecfg` 中调整 CPU 数量和内存分配。 ```python import os # 设置 WINEDEBUG 环境变量 os.environ['WINEDEBUG'] = '+all' ``` #### 注意事项 确保系统已安装所有必要的依赖项,包括 32 位和 64 位库。此外,某些应用程序可能需要特定版本的 Wine 才能正常工作。在这种情况下,可以尝试使用 Wine Staging 版本,它通常包含更多实验性功能和支持[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值