星际争霸(StarCraft)单人战役模式中有很多供人游玩的任务关卡。
tokitsukaze新开始了一关单人战役模式下的任务。在这场战役中,你要作为指挥官指挥克鲁普星区的艾伦人类(Terran)来防御人类的敌人——邪恶异虫(Zerg)的袭击。
这一次,作为指挥官,你的任务目标是尽可能多的保全人类方所拥有的7个基地。你在这次任务中拥有n个人口单位的兵力。为了防御异虫的攻击,每个基地都有一个能够抵挡异虫攻击的最小兵力需求L[i],同时每个基地因为有固定的人口上限,分配给该基地的兵力也不得大于上限R[i]。
你需要在任务一开始就为这7个基地做好兵力分配,每个兵都应该分配给一个基地,即不应该有空闲兵力。如果任何一个基地被异虫攻破(分配的兵力大于0,且小于最小兵力需求,导致兵力白白葬送牺牲),或者某个基地的人口超过了人口上限,兵力大于R[i],任务都会直接失败。
为了避免任务失败,tokitsukaze决定从一开始就放弃一些基地(即不对这些基地派出兵力)。
请问保证任务成功的条件下,tokitsukaze最多留下多少个基地?特别的,如果任务失败这种情况下请输出"0",不含引号。
由于tokitsukaze的星际操作十分流弊,你可以认为如果能够至少能够保留一个基地,任务就一定能够成功。
什么破数据啊,dfs就过了
之前用其他的方法,过了百分之九十一的数,,,,,,,,然后实在过不去了,用dfs试试,,竟然过了
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct node
{
ll mn,mx;
}a[10] ;
int maxt=0;
void dfs(int here,ll newsmxn,ll newsmin,ll news,int s)///第here个城池,所选取的城池的最大人数之和为newsmxn,所选取的城池的最小人数为newsmin,拥有人数news,已储存城池
{
if(news<=newsmxn&&news>=newsmin)
{
maxt=maxt>s?maxt:s;
}
for(int i=here;i<8;i++)
{
dfs(i+1,newsmxn+a[i].mx,newsmin+a[i].mn,news,s+1);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n;
scanf("%lld",&n);
ll maxn=0;
ll mixn=0;
for(int i=1;i<8;i++)
{
scanf("%lld%lld",&a[i].mn,&a[i].mx);
maxn+=a[i].mx;
mixn+=a[i].mn;
}
maxt=0;
dfs(1,0,0,n,0);
printf("%d\n",maxt);
}
return 0;
}