• 题解: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之后不要忘了退出程序。

  • 相关阅读:
    前端AJAX讲解
    torchvision.models中模型编辑的requires_grad
    Nacos报错 Can‘t find dependent libraries(坑!)
    Linux之文件打包和解压缩
    NSSCTF做题(6)
    2023 江西省赛 【9.26训练补题】
    .NET Apache Spark做基于商品推荐系统如此简单
    C语言项目实战——贪吃蛇
    POSIX 标准-信号量sem_t
    Ubuntu 20.04 安装部署 TiDB DM v7.3.0 集群【全网独家】
  • 原文地址:https://blog.csdn.net/sluckystar/article/details/133253410