鱼C论坛

 找回密码
 立即注册
查看: 2547|回复: 4

田忌赛马

[复制链接]
发表于 2023-4-8 19:49:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
田忌赛马
输入
输入最多包含 50 个测试用例。每种情况都以第一行的正整数 n (n <= 1000) 开头,这是每边的马数。第二行接下来的n个整数是田氏马的速度。然后第三行的下一个n个整数是国王马的速度。输入以一行结尾,该行在最后一个测试用例之后具有单个 0。
输出
对于每个输入案例,输出一行包含单个数字,每赢一场得200银元。这是田机将获得的最大金额,以银元为单位。

示例输入
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0

示例输出
200
0
0

  1. #include "stdio.h"
  2. #include <stdlib.h>
  3. int compare(const void *b, const void *a)
  4. {
  5.     return *(int*)a - *(int*)b;
  6. }

  7. int main()
  8. {
  9.         int c,i,win,ave,j,temp,tj[1001]={0},gw[1001]={0},k;
  10.         while(scanf("%d",&c)&&c!=0)
  11.         {
  12.                 for(i=0;i<c;i++)
  13.                 {
  14.                         scanf("%d",&tj[i]);
  15.                 }
  16.                 for(i=0;i<c;i++)
  17.                 {
  18.                         scanf("%d",&gw[i]);
  19.                 }
  20.                 qsort(tj, c, sizeof(int), compare);//田忌的马降序
  21.                 qsort(gw, c, sizeof(int), compare);//国王的马降序
  22.                 win=0;//胜场数
  23.                 ave=0;//平局数
  24.                 temp=-1; //king的马从temp开始, 之前的马速都大于田忌剩余马中速度最大的
  25.                 for(i=0;i<c;i++)//遍历田忌的马
  26.                 {
  27.                         for(j=temp+1;j<c;j++)//每次必定比掉一场
  28.                         {
  29.                                 if(tj[i] > gw[j]) //tj的马若遇到比他小的最大值则直接比掉
  30.                                 {
  31.                                         win++;
  32.                                         temp=j;
  33.                                         break;
  34.                                 }
  35.                                 else if(tj[i] == gw[j]) //势均力敌
  36.                                 {
  37.                                         for(k=j+1;k<c;k++)
  38.                                         {
  39.                                                 if(tj[i] > gw[k]) break;
  40.                                         }
  41.                                         if(k!=c) //平局之后还有比tj小的马
  42.                                         {
  43.                                                 win++;
  44.                                                 temp=k;
  45.                                         }
  46.                                         else //平局之后全部等于tj速度最大的马
  47.                                         {
  48.                                                 ave++;
  49.                                             temp=j;
  50.                                         }
  51.                                         break;
  52.                                 }
  53.                         }
  54.                         if(j==c) //已经比到国王的最慢的马了
  55.                         {
  56.                                 break;
  57.                         }
  58.                 }
  59.                 printf("%d\n",(2*win-c+ave)*200);//赢的场数-输的场数
  60.         }
  61.         return 0;
  62. }
复制代码

不知为何,总有几个测试点过不去,望大佬指点
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-8 20:10:56 | 显示全部楼层
isdkz 发表于 2023-4-8 19:52
你的代码逻辑是正确的,但是在处理平局情况时存在一些问题。

在平局时,你应该选择让田忌最慢的马与国王 ...

在遍历中,我已默认让tj最小的马去换gw最大的马,即temp之前的已经算作失败了(这里可能可以对tj后temp匹马做些简化)。
在你的代码中,判定平局后直接从tj下一匹马开始遍历,或许忽略了当前tj这匹马在gw的这匹马之后的情况:是全都平局,还是有可能胜出。
感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-4 02:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表