题意:给你n个兵器,每个兵器有两个攻击力,但只能使用一次,即调用其中一个攻击力,现在你面对了一个老怪,你对它攻击的攻击力只能从1开始,并依此递增1,现在问你你最多能打这个老怪几次。
思路:
思路一:其实这道题上来第一眼想到的是dfs,虽然后来也看到有写dfs的正解,但由于蒟蒻的想法太过于暴力,只水到了50分= =
刚开始的思路很简单,就是用vector存贮输入的每一个值的大小和分组,在dfs时跑过的组直接略过,直到不能再取出最大值或所有组都跑过时,记录一下当前情况下的最大值,并与当前答案比较,输出最大即可。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #include<map> 6 using namespace std; 7 const int N=1e6+10; 8 vector<pair<int,int> >edge[N];//存大小和分组 9 int vis[N],ans;//记录当前组是否来过和答案 10 int dfs(int x,int score){ 11 for(int i=0;i<edge[x].size();++i){ 12 if(vis[edge[x][i].second]) continue; 13 vis[edge[x][i].second]=true; //当前情况处理为来过 14 dfs(x+1,score+1); 15 vis[edge[x][i].second]=false;//当前情况递归结束,还原 16 } 17 ans=max(ans,score);//比较答案 18 } 19 int main(){ 20 int n; 21 scanf("%d",&n); 22 for(int i=1;i<=n;++i){ 23 int x,y; 24 scanf("%d%d",&x,&y); 25 edge[x].push_back(make_pair(x,i));//记录大小及编号 26 edge[y].push_back(make_pair(y,i)); 27 } 28 dfs(1,1); 29 printf("%d\n",ans-1); 30 return 0; 31 }