• 题解:ABC321B - Cutoff


    题解:ABC321B - Cutoff

    ·题目

    链接:Atcoder

    链接:洛谷

    ·难度

    算法难度:C。

    思维难度:C。

    调码难度:B。

    综合评价:见洛谷链接。

    ·算法

    分情况讨论。

    ·思路

    首先,如果目前的所有考试中分数最低的n-2场考试的分数加起来都能够满足要求,就直接输出0(即让第n次考试充当最低分),否则就把目前为止所有考试除了最低分和最高分之外都加起来,计算和与目标分数的差,如果该差小于等于目前最高分答案就是该差(让第n次考试充当中间值,即既不是最低也不是最高),否则就算你打的分再高,也只能作为最高分被忽略,所以只能输出-1。

    ·代价

    O(n*log(n)),每个判断都需要遍历一边每次考试的分数,但是由于我投懒,连求最大最小值都想排一下序。

    ·细节

    取最高分、最低分,用排序再合适不过。

    ·代码

    1. #include
    2. #define N 110
    3. using namespace std;
    4. int a[N]={},n=0,x=0;
    5. int calc();
    6. //求出目前考试分数掐头去尾剩余的总和与目标分数的差,差大于目前最大值返回-1(因为会被作为最大值忽略),否则返回差值
    7. bool check();
    8. //判断“目前为止最小的n-2次考试的分数总和也够用”是否成立
    9. int main(){
    10. scanf("%d%d",&n,&x);
    11. for(int i=1;i
    12. scanf("%d",&a[i]);
    13. }
    14. sort(a+1,a+n);
    15. //输入、排序
    16. if(check()==true){
    17. printf("%d\n",0);
    18. //如果目前为止最小的n-2次考试的分数总和也够用最后一次考试交白卷都行
    19. }else{
    20. printf("%d\n",calc());
    21. //否则输出calc的值
    22. }
    23. return 0;
    24. }
    25. int calc(){
    26. int sum=0;
    27. for(int i=2;i-1;i++){
    28. sum+=a[i];
    29. }
    30. //求和(掐头去尾)
    31. if(x-sum<=a[n-1]){
    32. //小于目前最大值可以返回
    33. return x-sum;
    34. }
    35. //否则返回-1
    36. return -1;
    37. }
    38. bool check(){
    39. int sum=0;
    40. for(int i=1;i-1;i++){
    41. sum+=a[i];
    42. }
    43. //求和(去尾)
    44. if(sum>=x){
    45. //够用就返回true
    46. return true;
    47. }
    48. //否则返回false
    49. return false;
    50. }

    ·注意

    输出0之后不要忘了退出程序。

  • 相关阅读:
    测试AI有效性的三种方法:流程挖掘是关键工具之一
    产品流程图设计
    快速入门SpringMVC,详解原理
    雷池WAF社区版的使用教程
    24-Docker-常用命令详解-dcoker search
    ​​​​​​​ARCGIS API for Python进行城市区域提取
    CCNA-DHCP(动态主机配置协议)
    c刷题【五】
    16. Thymeleaf教程(10分钟入门)
    使用 Spring Initializr 初始化 Spring Boot 项目
  • 原文地址:https://blog.csdn.net/sluckystar/article/details/133253410