洛谷·P1640 [SCOI2010]连续攻击游戏

题意:给你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 }
50分代码

相关文章:

  • 2021-09-30
  • 2021-11-21
  • 2021-06-22
  • 2021-09-07
  • 2021-12-21
  • 2021-07-04
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-02-07
  • 2021-08-16
  • 2021-09-30
  • 2022-12-23
  • 2021-09-08
  • 2021-08-05
  • 2022-01-03
相关资源
相似解决方案