zoukankan      html  css  js  c++  java
  • 2013年杭电计算机研究生复试的笔试题目:2道acm简单题(2013):1.(时分秒)时间相减;2.主持人和N-1个人玩游戏,每个人说出自己认识的人数,判断其中是否有人说谎。

    /*1、题目:输入一个数,代表要检测的例子的个数,每个例子中:输入两个时间(格式HH:MM : SS),前面时间减去后面时间,输出在时钟上显示的时间,格式一样,如果是以为数字的前面补零。
    */
    /*
    *思路:1.将两个时间都转换秒,进行相减,得到的结果再转化为时分秒形式;
    *2.先进行秒的相减,如果不够减,向分借1,接着进行分的减,如果不够减,向时借1,最后得出相减后一个时分秒的结果。
    */
    //解1:
    #include<stdio.h>
    int main()
    {
    int test;//代表要检测的例子的个数
    int HH1, MM1, SS1;//前一个时间
    int HH2, MM2, SS2;//后一个时间
    int total1, total2;
    int result_total,result_h,result_m,result_s;
    while (~scanf("%d",&test))
    {
    while (test--)
    {
    result_total = 0;
    total1 = 0;
    total2 = 0;
    result_h = 0;
    result_m = 0;
    result_s = 0;
    scanf("%d:%d:%d", &HH1, &MM1, &SS1);
    scanf("%d:%d:%d", &HH2, &MM2, &SS2);
    total1 = HH1 * 3600 + MM1 * 60 + SS1;
    total2 = HH2 * 3600 + MM2 * 60 + SS2;
    result_total = total1 - total2;
    result_h = result_total / 3600;
    result_total -= result_h*3600;//减去小时以后剩下的秒数
    result_m = result_total / 60;
    result_total -= result_m * 60;//减去分钟以后剩下的秒数
    result_s = result_total;
    printf("%02d:%02d:%02d ", result_h, result_m, result_s);
    }

    }
    return 0;
    }
    //解2
    #include<stdio.h>
    int main()
    {
    int test;//代表要检测的例子的个数
    int HH1, MM1, SS1;//前一个时间
    int HH2, MM2, SS2;//后一个时间
    int result_h, result_m, result_s;
    while (~scanf("%d", &test))
    {
    while (test--)
    {
    result_h = 0;
    result_m = 0;
    result_s = 0;
    scanf("%d:%d:%d", &HH1, &MM1, &SS1);
    scanf("%d:%d:%d", &HH2, &MM2, &SS2);
    if (SS1<SS2)//如果前一个时间的秒数不够减,则想分钟借1
    {
    MM1--;
    SS1 += 60;
    }
    result_s = SS1 - SS2;
    if (MM1<MM2)
    {
    HH1--;
    MM1 += 60;
    }
    result_m = MM1 - MM2;
    if (HH2 > 12)
    {
    HH2 %= 12;
    }
    if (HH1<HH2)
    {
    HH1 += 12;
    }
    result_h = HH1 - HH2;
    //%02d的意思就是说整数不够2列就补上0
    printf("%02d:%02d:%02d ", result_h, result_m, result_s);
    }
    }
    return 0;
    }

    /*
    2、题目:一个活动有N(1<N<100)个人参加,一个主持人和N-1个普通参加者,其中所有的人都认识主持人,主持人也认识所有的人,主持人要求N-1个参加者说出他们在参加者中所认识的人数,如果A认识B,则B认识A,所以最少是会认识一个人,就是主持人,他们说出了自己所认识的人数后,需要判断他们中有没有人说谎。
    输入:
    第一行是N,N = 0表示结束
    第二行是N - 1个数字
    输出:
    Lie absolutely 或者 Maybe truth
    7
    1 2 4 5 5 3

    9
    3 7 7 7 7 5 6 6
    两个测试例子中第一个是Lie absolutely,第二个是Maybe truth
    */

    /*思路:一共有N个人,除去主持人共有N-1个人,这N-1个人都说了自己认识的人数(至少为1,因为每个人都认识主持人),认识都是相互的,A认识B,则B也认识A,N-1个人按照所认识的人数从高到低排序;
    比如输入N个数,再输入N-1个数
    9
    3 7 7 7 7 5 6 6
    先把这8(N-1)个数从高到低排序,7 7 7 7 6 6 5 3,第一个人说认识7个人,除了主持人以外还认识6个人,就当作是靠近他的后面6个人,除去第一个人,那么后面的人所说的认识的人数需要减去1,
    变为7 6 6 6 5 5 4 3 ,再次排序变为7 6 6 6 5 5 4 3;(注意:排序的话只要将出第一个人以外的重新排序就好,因为第一个没有改变数值,其余的都可能改变了)
    第二个人说认识6个人,除了主持人以外还认识5个人,就当作是靠近他的后面5个人,除去第二个人,那么后面的人所说的认识的人数需要减去1,
    变为7 6 5 5 4 4 3 3,再次排序变为7 6 5 5 4 4 3 3;
    第三个人说认识5个人,除了主持人以外还认识4个人,就当作是靠近他的后面4个人,除去第三个人,那么后面的人所说的人数需要减去1,
    变为7 6 5 4 3 3 2 3,再次排序变为7 6 5 4 3 3 3 2;
    第四个人说认识4个人,除了主持人以外还认识3个人,就当作是靠近他的后面的3个人,除去第四个人,那么后面的人所说的人数需要减去1,
    变为7 6 5 4 2 2 2 2,再次排序变为7 6 5 4 2 2 2 2;
    第五个人说认识2个人,除了主持人以外还认识1个人,就当作是靠近他的后面的1个人所说的人数减1,
    变为7 6 5 4 2 1 2 2,再次排序变为7 6 5 4 2 2 2 1;
    第六个人说认识2个人,除了主持人以外还认识1个人,就当作是靠近他的后面的1个人所说的人数减1,
    变为7 6 5 4 2 2 1 1,再次排序变为7 6 5 4 2 2 1 1;
    第七个人说认识1个人,说明他只认识主持人;
    第八个人说认识1个人,说明他只认识主持人。
    */
    #include <stdio.h>
    #include <stdlib.h>

    //const void *a这是定义了一个指针a,a可以指向任意类型的值,但它指向的值必须是常量。在这种情况下,我们不能修改被指向的对象,但可以使指针指向其他对象。
    int cmp(const void *a, const void *b)
    {
    //(int *)是强行转换
    //*(int *)是强行转换后去指针指向变量的值
    return *(int *)b - *(int *)a;
    }

    int main(void)
    {
    int i, j, n, a[100];
    while (scanf("%d", &n) != EOF && n)
    {
    for (i = 0; i < n - 1; ++i)
    scanf("%d", &a[i]);
    for (i = 0; i < n - 1; ++i)
    {
    //查资料可知:qsort是C语言的,sort是C++ STL库的成员函数,一般情况下,sort的效率高于qsort
    qsort(a + i, (n - i - 1), sizeof(int), cmp);
    //最后一个数是最小的可以为1,但是不能为0,因为他肯定认识主持人,为0就是这些人中有人说谎了
    if (0 == a[n - 2])
    {
    printf("Lie absolutely ");
    break;
    }
    //如果排序后,当前认识的人和其后面的人数都是1了,那一个人都是主持人,也是Maybe truth
    else if (1 == a[i])
    {
    //当前的人是1,且最后一个也是1,当前到最后的中间的人都是1,则证明是对的
    //下面的if判断语句画蛇添足了,因为上面一个if已经判断过最后一个数是不是0了,其不是0的话肯定就是大于等于1的整数,所以如果当前这个不是0是1,那么最后一个也不是0必须是1,中间的也不是0,肯定是1,所以就是对的
    //if (i == n - 2)
    //{
    printf("Maybe truth ");
    break;
    //}
    }
    else
    {
    //此人认识其后的a[i]个人
    for (j = 1; j < a[i]; ++j)
    --a[i + j];
    }
    }
    }
    return 0;
    }

    参考博客:http://blog.csdn.net/hackbuteer1/article/details/6678851

    一生有所追!
  • 相关阅读:
    WEBUS2.0 In Action
    WEBUS2.0 In Action
    WEBUS2.0 In Action
    WEBUS2.0 In Action
    在Linux查看版本命令
    Increasing heap size while building the android source code on Ubuntu 15.10
    在Linux中增加swap空间
    Patch
    使用Vim比较两个文件的内容
    @override 重写 与重载
  • 原文地址:https://www.cnblogs.com/BlueBlue-Sky/p/8478244.html
Copyright © 2011-2022 走看看