初遇ACM社团题

  • 题目简介

    • 猜比分

      给定一组比分 如:*114514 : 191981*

      让N个人来猜比分

      第1个人编号为1

      第2个人编号为2

      ……

      第N个人编号为N

      找出猜出比分最接近真实比分的编号

    • Input

      每行包含两个整数 以空格分开(范围都在[0~999999]内)
      第一行两个整数是CC PJ 的最终比分
      从第二行开始的若干行

      分别是

      第1位同学的竞猜结果

      第2位同学的竞猜结果

      ……

      第N位同学的竞猜结果

      以-1 -1结束输入

    • Output

      一个整数 表示的是竞猜比分最接近真实结果的同学的编号

    • Sample Input

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      SHELL

      1328 1158
      500 700
      36 38
      423 450
      100 80
      380 80
      550 450
      735 735
      520 680
      390 170
      1800 800
      16 61
      61 16
      50 48
      66 60
      800 200
      43 29
      400 600
      900 800
      98 98
      401 451
      350 500
      173 184
      576 486
      113 255
      300 275
      666 545
      275 194
      361 258
      66 63
      98 138
      272 243
      500 500
      257 76
      927 826
      600 560
      100 150
      2246 1748
      350 300
      23 30
      300 200
      369 396
      300 500
      436 327
      970 630
      400 550
      400 500
      400 500
      1000 600
      555 333
      350 300
      2028 1197
      777 456
      -1 -1
    • Sample Output

      1
      2
      SHELL
      34
  • 急功近利

    首先,这道题并不复杂,甚至可以用简单来形容,基本上是没有什么算法的,只有单纯的选择、赋值与记录,作为一名C语言初学者,相比于平时的练习题,冗长复杂的题目介绍以及输入数据让我开头就上了心态(因为也是班上前几的排名所以比较着急)。也可能是沉迷于网站搭建,脑子里早就把当初对C的理解、逻辑抛在脑后,剩下的就只有焦虑和惊慌失措,写的循环乱七八糟,有些条件甚至是互斥的(真不知道当时脑子是怎么想的),错误…….死循环……

    以为需要排序算法还去看了算法的屑

    换了三种方案,很遗憾都是Wrong Answer

  • 开摆

    放弃了,继续美化博客和网上冲浪

  • 梦醒时分

    大早上起来军训,站在体育场上被寒风刮被细雨打,一瞬间我理解了宮本浩次

    • 冬の花

      事被撅了罢

      其实只需要将比分赋值为a,b;循环扫描猜想比分m,n;

      编号++

      再将之做差

      将所得差寄存

      如果后续的差小于此时差,则被替换为后续差(差越小表示越接近)

      同时在定义一个变量将编号寄存

      重复循环至结束

  • Code

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    C

    #include <bits/stdc++.h>
    int main()
    {
    int a,b; //正确比分
    int m,n; //每组猜想比分
    int c,d; //差
    int num=0,truth; //编号以及记录编号
    int x=999999,y=999999; //记录最小的差

    scanf("%d%d",&a,&b); //第一组数据 正确比分
    while(1)
    {
    scanf("%d%d",&m,&n); //循环输入每组比分
    if(m==-1 && n==-1)
    break; //满足条件跳出循环
    /*作差*/
    if(m>=a)
    {
    c=m-a;
    }
    if(m<a)
    {
    c=a-m;
    }
    if(n>=b)
    {
    d=n-b;
    }
    if(n<b)
    {
    d=b-n;
    }
    /*顺序记录编号*/
    num++;
    /*判断是否更新最小差以及输出编号*/
    if(c<=x && d<=y)
    {
    x=c;
    y=d;
    truth=num;
    }
    }
    /*输出*/
    printf ("%d",truth);
    return 0;
    }
  • 总结

    我是小丑

    一定要先分析思路,整理逻辑!!!