1. 程式人生 > >Campaign ~~ 牛客 第十五屆浙江大學寧波理工學院程式設計大賽(同步賽) ~~~ 二進位制列舉

Campaign ~~ 牛客 第十五屆浙江大學寧波理工學院程式設計大賽(同步賽) ~~~ 二進位制列舉

連結:https://ac.nowcoder.com/acm/contest/303/D
來源:牛客網
 

星際爭霸(StarCraft)單人戰役模式中有很多供人遊玩的任務關卡。

 

tokitsukaze新開始了一關單人戰役模式下的任務。在這場戰役中,你要作為指揮官指揮克魯普星區的艾倫人類(Terran)來防禦人類的敵人——邪惡異蟲(Zerg)的襲擊。

 

這一次,作為指揮官,你的任務目標是儘可能多的保全人類方所擁有的7個基地。你在這次任務中擁有n個人口單位的兵力。為了防禦異蟲的攻擊,每個基地都有一個能夠抵擋異蟲攻擊的最小兵力需求L[i],同時每個基地因為有固定的人口上限,分配給該基地的兵力也不得大於上限R[i]。

 

你需要在任務一開始就為這7個基地做好兵力分配,每個兵都應該分配給一個基地,即不應該有空閒兵力。如果任何一個基地被異蟲攻破(分配的兵力大於0,且小於最小兵力需求,導致兵力白白葬送犧牲),或者某個基地的人口超過了人口上限,兵力大於R[i],任務都會直接失敗。

 

為了避免任務失敗,tokitsukaze決定從一開始就放棄一些基地(即不對這些基地派出兵力)。

 

請問保證任務成功的條件下,tokitsukaze最多留下多少個基地?特別的,如果任務失敗這種情況下請輸出"0",不含引號。

 

由於tokitsukaze的星際操作十分流弊,你可以認為如果能夠至少能夠保留一個基地,任務就一定能夠成功。

輸入描述:

第一行輸入一個T(T≤50000),表示T組資料。

對於每組資料:
輸入一個正整數n(1≤n≤10^9)表示需要分配的兵力總人口。
接下來7行,每行兩個正整數L,R(1≤L≤R≤10^9),分別表示該基地夠抵擋異蟲攻擊的最小兵力需求與該基地的人口上限。

輸出描述:

對於每組資料,輸出tokitsukaze最多能夠留下幾個基地,每組資料佔一行。

示例1

輸入

複製

4
50
1 1
1 1
1 1
1 1
1 1
1 1
1 1
50
1 1
20 30
20 30
20 30
1 1
20 30
20 30
70
19 19
10 10
10 10
10 10
10 10
10 10
1 1
2
1 1
3 3
3 3
3 3
3 3
3 3
3 3

輸出

複製

0
4
7
0

說明

第一個樣例,無論tokitsukaze怎麼取捨,都不能滿足條件。在這種特殊情況下你應該輸出0。

第二個樣例,tokitsukaze選擇第一個第二個第三個和第五個基地,分別分配1,20,28,1的兵力即可滿足既能完全分配兵力,同時這4個基地既能防禦異蟲的攻擊,也不超過每個基地的人口上限。

第三個樣例,tokitsukaze分別分配19,10,10,10,10,10,1給7個基地就能保證既能完全分配兵力,同時這7個基地既能防禦異蟲的攻擊,也不超過每個基地的人口上限。

第四個樣例,tokitsukaze如果只選擇1號基地,那麼要麼無法將所有的兵力完全分配,要麼該基地的人口總數將會大於上限,所以任務會直接失敗,而如果選擇其他基地,那麼由於不能達到防禦的最小下界。所以也會導致任務失敗。不論怎麼取捨任務都會失敗,所以這種情況下應該輸出0。

 

思路 : 二進位制列舉所有情況;

#include<iostream>
#include<stdio.h>
#include<queue>
#include<string.h>
#include<algorithm>
#include<string>
#include<stack>
#define ll long long
using namespace std;
struct Node
{
    int L,R;
}AA[8];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        ll n ;
        cin>>n;
    //  ll sumL = 0 ;
        ll sumR = 0 ;
        for(int i=0 ; i<7 ; i++)
        {
            cin>>AA[i].L>>AA[i].R ;
        //  sumL = sumL + AA[i].L ;
            sumR = sumR + AA[i].R ; 
        }
        if(sumR<n)
        {
            cout<<"0"<<endl;
            continue;
        }
        ll ZT = 1<<7 ;
        ll ans=-1;
//      cout<<ZT<<endl;
        for(ll i=0 ; i<ZT ; i++)
        {
        //  cout<<i<<endl;
            ll suml=0 , sumr=0 ;
            ll cnt=0;
            for(ll j=0 ; j < 7 ; j++)
            {
                if(i&(1<<j))
                {
                    suml = suml + AA[j].L;
                    sumr = sumr + AA[j].R;
                    cnt++;
                }
            }
    /*      if(cnt==4)
            {
                cout<<suml<<"  "<<sumr<<endl;
            }*/
            //cout<<cnt<<endl;
            if(n>=suml && n<=sumr)
            {
                //cout<<cnt<<endl;
                ans=max(ans,cnt);
            }
        }
        if(ans==-1)
        {
            cout<<"0"<<endl;
        }
        else
        {
            cout<<ans<<endl;
        }
         
     
         
    }
    return 0;
}