• 牛客周赛 Round 16


    A、

    题目描述

    给定一个大小为n的数组a,请你判断一个数组是否满足以下条件:
    1. 数组严格升序,即a1 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. }

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

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

  • 相关阅读:
    Linux开发——Ubuntu 下文本编辑(三)
    【Java基础(六)】面向对象与类的基础知识
    ffmpeg 命令行 pcm 编码 MP3
    Oracle/PLSQL: Median Function
    生物制剂\化工\化妆品等质检损耗、制造误差处理作业流程图(ODOO15/16)
    拥抱 OpenAPI 3:springdoc-openapi 食用指南
    springboot集成dubbo+zookeeper简单搭建(细到你没有感觉)
    GO语言规范
    若依集成mybatisplus报错找不到xml
    华为云云耀云服务器L实例评测|Elasticsearch的可视化Kibana工具安装 & IK分词器的安装和使用
  • 原文地址:https://blog.csdn.net/m0_61949623/article/details/133999870