【刷题】【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; }