• c++ 田忌赛马(史上最全)上海月赛乙组T3


    原题连接: 上海市计算机学会竞赛平台 | YACS


    一,思路

    先对田忌和齐王的马的速度的数组进行一次从小到大的排序。

    我们先比较田忌最快的马和齐王最快的马的速度。

    一.若田忌获胜,就让这两匹马比赛。

    二,若田忌最快的马跟齐王最快的马的速度相等,则比较他们最慢的马的速度。

    1:田忌最慢的马比齐王最慢的马的速度快,则让它们比赛。

    2:田忌最慢的马比齐王最慢的马的速度慢或者相等,则让田忌最慢的马和齐王最快的马比赛。

    三,否则,用田忌最慢的马和齐王最快的马比赛。


    二,WA + TLE祭

    代码:

    1. #include
    2. using namespace std;
    3. long long n,qi[500005],ta[500005],fen,tn;
    4. int main()
    5. {
    6. scanf("%lld",&n);
    7. tn = n;
    8. for(int i = 1; i <= n; i++) scanf("%lld",&ta[i]);
    9. for(int i = 1; i <= n; i++) scanf("%lld",&qi[i]);
    10. sort(ta + 1,ta + 1 + n);
    11. sort(qi + 1,qi + 1 + n);
    12. for(int i = 1; i <= tn; i++)
    13. {
    14. if(ta[n] > qi[n])
    15. {
    16. fen++;
    17. n--;
    18. }
    19. else if(ta[n] == qi[n])
    20. {
    21. if(ta[1] > qi[1])
    22. {
    23. fen++;
    24. for(int j = 2; j <= n; j++) ta[j - 1] = ta[j],qi[j - 1] = qi[j];
    25. n--;
    26. }
    27. else
    28. {
    29. fen--;
    30. for(int j = 2; j <= n; j++) ta[j - 1] = ta[j];
    31. n--;
    32. }
    33. }
    34. else
    35. {
    36. fen--;
    37. for(int j = 2; j <= n; j++) ta[j - 1] = ta[j];
    38. n--;
    39. }
    40. }
    41. printf("%lld",fen);
    42. return 0;
    43. }

    WA是因为在让田忌最慢的马和齐王最快的马比赛时忘了特判田忌赢,平局的情况

    TLE是因为在比完一场比赛后为了不用一样的马重复比用了O(n)时间复杂度的删除操作

    总共时间复杂度:O(n^2)


    三,AC祭

    因为我们的贪心策略只会动田忌和齐王最慢/快的马,

    所以可以用qi_max来存储齐王最快马的下标,qi_min来存储齐王最慢马的下标,

    ta_max来存储田忌最快马的下标,

    ta_min来存储田忌最慢马的下标,

    如果齐王的最快马比完赛了那么就qi_max--,

    如果齐王的最慢马比完赛了那么就qi_min++,

    如果田忌的最快马比完赛了那么就ta_max--,

    如果田忌的最慢马比完赛了那么就ta_min++。

    总共时间复杂度:O(n)

    代码:

    1. #include
    2. using namespace std;
    3. long long n,qi[500005],ta[500005],fen,tn,ta_max,ta_min,qi_max,qi_min;
    4. int main()
    5. {
    6. scanf("%lld",&n);
    7. tn = n;
    8. for(int i = 1; i <= n; i++) scanf("%lld",&ta[i]);
    9. for(int i = 1; i <= n; i++) scanf("%lld",&qi[i]);
    10. sort(ta + 1,ta + 1 + n);
    11. sort(qi + 1,qi + 1 + n);
    12. ta_max = n,qi_max = n,ta_min = 1,qi_min = 1;
    13. while(n--)
    14. {
    15. if(ta[ta_max] > qi[qi_max])
    16. {
    17. ta_max--;
    18. qi_max--;
    19. fen++;
    20. }
    21. else if(ta[ta_max] == qi[qi_max])
    22. {
    23. if(ta[ta_min] > qi[qi_min])
    24. {
    25. ta_min++;
    26. qi_min++;
    27. fen++;
    28. }
    29. else
    30. {
    31. if(ta[ta_min] > qi[qi_max])
    32. {
    33. fen++;
    34. ta_min++;
    35. qi_max--;
    36. }
    37. else if(ta[ta_min] == qi[qi_max])
    38. {
    39. ta_min++;
    40. qi_max--;
    41. }
    42. else
    43. {
    44. fen--;
    45. ta_min++;
    46. qi_max--;
    47. }
    48. }
    49. }
    50. else
    51. {
    52. fen--;
    53. ta_min++;
    54. qi_max--;
    55. }
    56. }
    57. printf("%lld",fen);
    58. return 0;
    59. }
  • 相关阅读:
    yolov5训练flash芯片引脚
    scss使用自定义函数实现单位像素随屏幕比例动态缩放
    视频AI分析定时任务思路解析
    《Vue入门到精通之webpack详解》
    HTML和CSS入门学习
    EFCore之执行原生SQL语句
    【Nginx】nginx隐藏版本号
    JAVA实训第二天
    StringBuilder
    CSS零碎知识点记录
  • 原文地址:https://blog.csdn.net/weq2011/article/details/127652349