acwing 每日一题4889. 空调II
目录
题目简述:
思路分析:
https://www.acwing.com/problem/content/4892/
题目简述:
给N头牛和M个空调,以及每头牛所占据的区域和每个空调所作用的区域,娇贵的牛对温度有要求,所以农夫需要用空调对牛棚进行降温,但是资本家农夫想以尽可能低的成本来实现牛的需求,所以请你来帮忙;
思路分析:
这个数据范围很特殊,看一眼就知道八九不离十是dfs,然后在仔细细想,确实可以用dfs实现;
回想一下之前做过的dfs模型,这个类似于指数级枚举,指数级枚举是判断当前数选或者不选,然后这个题是判断当前空调选或者不选,然后寻找符合条件的花费最少的一种方案,需要注意的是本题中的空调信息比较多,所以用结构体来存;
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=25;
int mp[110];
//将每一个牛的需求存在一个数组里,最后看数组最终情况,如果<=零那么就符合条件,更新成本的值;
int n,m,res=1e8,cnt;
struct kt
{
int l,r,p,w;
}kk[15];
bool st[15];
//标记当前空调选没选过
void dfs(int x)
{
//判断是否满足条件
if(x>m)
{
for(int i=1;i<=100;i++)
{
if(mp[i]>=1)
return ;
}
res=min(res,cnt);
return ;
}
if(st[x])return ;
//更改
cnt+=kk[x].w;
for(int i=kk[x].l;i<=kk[x].r;i++)
{
mp[i]-=kk[x].p;
}
st[x]=1;
dfs(x+1);
//复原
st[x]=0;
for(int i=kk[x].l;i<=kk[x].r;i++)
{
mp[i]+=kk[x].p;
}
cnt-=kk[x].w;
dfs(x+1);
}
signed main()
{
cin >> n >> m ;
for(int i=1;i<=n;i++)
{
int l,r,c;
cin >> l >> r >> c;
for(int j=l;j<=r;j++){
mp[j]=c;
}
}
for(int i=1;i<=m;i++)
{
cin >> kk[i].l>>kk[i].r>>kk[i].p>>kk[i].w;
}
dfs(1);
cout << res<<endl;
}
下面是指数级枚举的板题:
https://www.acwing.com/problem/content/94/