牛客网_第十五届浙江大学宁波理工学院程序设计大赛(同步赛)Campaign

星际争霸(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;
}

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值