当前位置:   article > 正文

牛客周赛 Round 16_游戏中有n个怪物,打败后血量降为怪物的血量

游戏中有n个怪物,打败后血量降为怪物的血量

A、

题目描述

给定一个大小为n的数组a,请你判断一个数组是否满足以下条件:
1. 数组严格升序,即a1<a2<...<an。
2. 对于1≤i≤n−1,我们定义bi​=a(i+1​)−ai​,则数组b严格降序,即b1​>b2​>...>b(n−1)​。
输入描述:

第一行输入一个正整数n,代表数组的大小。
第二行输入n个正整数ai​,代表给定的数组。
3≤n≤10^5
1≤ai​≤10^9

输出描述:

若满足给定的两个条件,则输出 Yes。否则输出 No。

示例1

输入

3
1 3 4

输出

Yes
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define fp(i,a,b) for(int i=a;i<=b;++i)
  5. #define PII pair<int,int>
  6. const int N=2e5+10;
  7. const int mod=1e9+7;
  8. const double eps=1e-5;
  9. typedef double db;
  10. int n;
  11. int a[N];
  12. int b[N];
  13. void solve()
  14. {
  15. ;
  16. }
  17. signed main()
  18. {
  19. cin>>n;
  20. fp(i,1,n)cin>>a[i];
  21. bool flag1=false;
  22. bool flag2=false;
  23. for(int i=1;i<=n-1;i++)
  24. {
  25. if(a[i]>=a[i+1])
  26. {
  27. flag1=true;
  28. break;
  29. }
  30. }
  31. for(int i=1;i<=n-1;i++)
  32. {
  33. b[i]=a[i+1]-a[i];
  34. }
  35. for(int i=1;i<=n-2;i++)
  36. {
  37. if(b[i]<=b[i+1])
  38. {
  39. flag2=true;
  40. break;
  41. }
  42. }
  43. if(flag1==false&&flag2==false)
  44. {
  45. cout<<"Yes"<<"\n";
  46. }
  47. else
  48. {
  49. cout<<"No"<<"\n";
  50. }
  51. return 0;
  52. }

 B、

题目描述

小美在训练场打靶,靶一共有 10 环,靶的中心位于 (0,0),如果打中的位置在以靶心为圆心,半径为 1 的圆内,则得 10 分,之后每向外一圈分数减 1,直到 1 分,每圈的半径都比上一圈大 1。即如果打中的位置在以靶心为圆心,半径为 iii 的圆内,则得 11−i 分。
如果打中的位置不在任何一圈内,则得 0 分。

输入描述:

一行两个整数 x,y,表示打中的位置坐标。
0≤x,y≤10

输出描述:

输出一个整数,表示得分。

示例1

输入

1 0

输出

10

示例2

输入

1 1

输出

9
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define fp(i,a,b) for(int i=a;i<=b;++i)
  5. #define PII pair<int,int>
  6. const int N=2e5+10;
  7. const int mod=1e9+7;
  8. const double eps=1e-5;
  9. typedef double db;
  10. int x,y;
  11. void solve()
  12. {
  13. ;
  14. }
  15. signed main()
  16. {
  17. cin>>x>>y;
  18. int f=x*x+y*y;
  19. int q=ceil(sqrt(f*1.0));
  20. cout<<min(10ll,max(0ll,11-q))<<"\n";
  21. return 0;
  22. }

 A、B很简单,不做分析。

C、

题目描述

小美在玩游戏,游戏中有 n 个怪物,怪物的血量为hi​,攻击力为 ai​。小美的血量为 H,攻击力为 A,小美可以击败血量和攻击力都小于自己的怪物,并且打败后血量降为怪物的血量,攻击力降为怪物的攻击力。小美想知道最多可以打败多少怪物。

输入描述:

第一行三个整数 n,H,A,分别表示怪物的数量,小美的血量,小美的攻击力。
第二行 n 个整数 hi​,表示怪物的血量。
第三行 n 个整数 ai​,表示怪物的攻击力。
1≤n≤10^3
1≤ai​,hi​,H,A≤10^9

输出描述:

输出一个整数表示答案。

示例1

输入

3 4 5
1 2 3
3 2 1

输出

1

说明

最多只能击败一个怪物。

建立dp

dp[i]=max(dp[i],dp[j]+1)

如何建立这个表达式

首先我们得先对x、y的某一维从大到小排序

然后二层循环跑一下,注意dp的逻辑需要正确。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define fp(i,a,b) for(int i=a;i<=b;++i)
  5. #define PII pair<int,int>
  6. const int N=2e5+10;
  7. const int mod=1e9+7;
  8. const double eps=1e-5;
  9. typedef double db;
  10. int n,h,a;
  11. int dp[N];
  12. int x[N];
  13. int y[N];
  14. struct node
  15. {
  16. int hh,aa;
  17. }Node[N];
  18. bool cmp(node f,node t)
  19. {
  20. return f.hh>t.hh;
  21. }
  22. signed main()
  23. {
  24. cin>>n>>h>>a;
  25. fp(i,1,n){
  26. cin>>x[i];
  27. }
  28. fp(i,1,n){
  29. cin>>y[i];
  30. }
  31. int ans=0;
  32. fp(i,1,n)
  33. {
  34. if(h>x[i]&&a>y[i])
  35. {
  36. Node[++ans]={x[i],y[i]};
  37. }
  38. }
  39. int mmax=0;
  40. sort(Node+1,Node+1+ans,cmp);
  41. for(int i=1;i<=ans;i++)
  42. {
  43. dp[i]=max(1ll,dp[i]);
  44. for(int j=1;j<=i-1;j++)
  45. {
  46. if(Node[i].aa<Node[j].aa&&Node[i].hh<Node[j].hh)
  47. {
  48. dp[i]=max(dp[i],dp[j]+1);
  49. }
  50. }
  51. mmax=max(mmax,dp[i]);
  52. }
  53. cout<<mmax<<"\n";
  54. return 0;
  55. }

D、

题目描述

地图上有n个城市,小美准备修建一些道路,使得任意两个城市之间都能通过道路到达。现在给定一些修路的计划(有一些计划是必选的),请你帮小美规划出最优的方案。

输入描述:

第一行输入两个正整数n,m,用空格隔开。代表城市数量。
接下来的m行,每行输入四个正整数u,v,w,p,代表一个计划是在城市u和城市v之间修建一条道路,花费为w。如果p为 1,代表该计划必选。如果p为 0,代表该计划是可选的。
1≤n,m≤10^5
1≤u,v≤n
1≤w≤10^9
0≤p≤1

输出描述:

如果无解(即无法使得任意两个城市之间都能通过道路到达),则输出 -1。
如果有解,则第一行输入一个正整数k,代表选择的计划数量。第二行输入k个正整数bi​,代表选择的计划。
你只需要保证最终所有的城市都可以通过道路连通,且总代价最小即可。请注意,p=1的计划是必选的,如果你的方案不包含某个p=1的计划,则会直接返回答案错误。

示例1

输入

3 4
1 2 3 1
1 2 2 0
1 3 1 0
2 3 3 0

输出

2
1 3

说明

选择第一个和第三个方案,总花费为 4。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define fp(i,a,b) for(int i=a;i<=b;++i)
  5. #define PII pair<int,int>
  6. const int N=2e5+10;
  7. const int mod=1e9+7;
  8. const double eps=1e-5;
  9. typedef double db;
  10. int n,m;
  11. struct node
  12. {
  13. int u,v,w;
  14. int pos;
  15. bool p;
  16. }Node[N];
  17. bool cmp(node a,node b)
  18. {
  19. if(a.p==b.p)
  20. {
  21. return a.w<b.w;
  22. }
  23. else
  24. {
  25. return a.p>b.p;
  26. }
  27. }
  28. int p[N];
  29. void init()
  30. {
  31. fp(i,1,n)
  32. {
  33. p[i]=i;
  34. }
  35. }
  36. int find(int x)
  37. {
  38. if(p[x]!=x)return p[x]=find(p[x]);
  39. return p[x];
  40. }
  41. vector<int>T;
  42. signed main()
  43. {
  44. cin>>n>>m;
  45. fp(i,1,m)
  46. {
  47. cin>>Node[i].u>>Node[i].v>>Node[i].w>>Node[i].p;
  48. Node[i].pos=i;
  49. }
  50. init();
  51. sort(Node+1,Node+1+m,cmp);
  52. int cnt=0;
  53. int sum=0;
  54. for(int i=1;i<=m;i++)
  55. {
  56. int u=Node[i].u;
  57. int v=Node[i].v;
  58. int w=Node[i].w;
  59. //cout<<u<<" "<<v<<" "<<w<<"\n";
  60. u=find(u);
  61. v=find(v);
  62. if(p[u]!=v)
  63. {
  64. cnt++;
  65. sum+=w;
  66. p[u]=v;
  67. T.push_back(Node[i].pos);
  68. }
  69. else if(Node[i].p==1)
  70. {
  71. T.push_back(Node[i].pos);
  72. //cnt++;
  73. }
  74. if(cnt==n-1)
  75. {
  76. break;
  77. }
  78. }
  79. if(cnt==n-1){
  80. cout<<T.size()<<"\n";
  81. sort(T.begin(),T.end());
  82. for(auto x:T)
  83. {
  84. cout<<x<<" ";
  85. }
  86. cout<<"\n";
  87. }
  88. else cout<<-1<<"\n";
  89. return 0;
  90. }

最小生成树改一点点就行。

把预置的边优先级设为最大,然后再取边的时候进行小改一下就行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/44263
推荐阅读
相关标签
  

闽ICP备14008679号