【刷题】【dfs】【暴力】不如来上分

题面

最近,小张正在上分。

这一天小张进行了n局游戏,每局游戏都可以从两个英雄中选择一位,由于小张的发挥过于稳定,所以他的游戏结果(即此局获得的分数)只与选择英雄的属性值相关(选择某一英雄获得的分数等于他的属性值),并且小张手中有若干次礼遇的机会,使用后能使得本局游戏能额外多出两个英雄可以选择。换言之,不使用礼遇只能在原有的两种英雄中选择一种,使用后可以在四种英雄中选择一种。

每局游戏后小张都会看一眼排行榜,如果他上榜了就会很开心。

小张想上榜的欲望过于强烈以至于打动了时空之神,神给与了他自由排列游戏顺序的能力。

现在给出每局游戏的选将情况和结束后上榜需要的分数,小张想知道通过能力合理排列并进行最优选择后,他最多因上榜而开心的次数。

注意:重排游戏顺序后,每局游戏结束后上榜分数的顺序不变,即第i局要求分数依然为pi

 

思路:数据范围,直接暴力​
注意wa的地方

 

#include<bits/stdc++.h>

using namespace std;

int n,k,s;
const int N=30;
int p[N],a[N],b[N],d[N],cp[N];
int ans; 

bool cmp(int a,int b)
{ return a>b; }

void dfs(int x,int cnt)
{
//    bool pt=false;
//    if(ans==4 ) pt=true;
    
    if(ans==n ) return ;
    if(x>n ) 
    {
//        if(pt)
//        {
//            for(int i=1;i<=n;i++)
//                printf("%d ",d[i]);
//            cout<<endl;
//        }
        
        //sort(d+1,d+n+1,cmp); wa的原因
        //sort后d数组顺序变了,在dfs中前面的数字会变大 
        for(int i=1;i<=n;i++)
            cp[i]=d[i];
        sort(cp+1,cp+n+1,cmp);
         
        int sum=s,n_ans=0;
        for(int i=1;i<=n;i++)
        {
            sum+=cp[i];
            //if(pt && sum>=p[i] ) cout<<i<<" "<<cp[i]<<endl;
            if(sum>=p[i] ) n_ans++;
        } 
        ans=max(ans,n_ans); 
        //printf("%d\n",ans);
        return ;
    }
    
    d[x]=a[x];
    dfs(x+1,cnt);
    if(cnt<k && b[x]>a[x] )
    {
        d[x]=b[x];
        dfs(x+1,cnt+1); 
    } 
}

int main()
{
    cin>>n>>k>>s;
    for(int i=1;i<=n;i++) cin>>p[i];
    for(int i=1,x,y;i<=n;i++)
    {
        cin>>x>>y;
        a[i]=max(x,y);
        cin>>x>>y;
        b[i]=max(x,y);
    }
    
    dfs(1,0);
    cout<<ans;
    return 0;
} 
View Code

 

posted @ 2022-03-21 16:35  心若笺诗  阅读(23)  评论(0编辑  收藏  举报