zoey
点击国内主页可以让浏览速度加快哦 ~ !

校内算法考试(第三次)总结

2019-08-30 C/C++ 系csp 时间都去哪儿了 找出第n个数 QHU军训有射击 QHU高数&线代&概率论
Word count: 1.2k | Reading time: 5min


    总结一下这次没发挥好的系内CSP:
    A题冒号明明就是英文状态下的,但是他样例输出中的却是中文字符的冒号,导致我一开始是写的对的,但是就因为冒号的原因没A过,后面就给耽误了时间了。B题因为一开始拿到这种排序题是没有思路的,再加上我感觉他图例中的最后一位应该是36,但是他却写的35,一直等有没有人过来纠正,所以直接跳到第三个题上面去了,结果很扎心,C题时间内没有A出来,所以这次考试GG了。




问题 A: 时间都去哪儿了

题目

问题 A: 时间都去哪儿了
T时间限制: 1 Sec 内存限制: 128 MB

题目描述
    假设从凌晨00:00:00开始以秒为单位计时,那么经过61秒,时间就是00:01:01, 如果经过1261秒那么时间就是00:21:01, 现在给定经过的秒数,请算出现在的时间。注意输出按时间的标准格式,24小时制,并且不足两位数的,高位补0。

输入
    输入一个整数,表示计时器现在的秒数

输出
    输出一个标准时间

样例输入
1261

样例输出
00:21:01

命题人

    duzhengjun




原题链接

由于我们学校的是内网系统,所以原题链接过不去也正常
More info:Question


AC源码(c++)

没什么要说的,但是就是冒号的关系,本来是觉得直接ctrl c+v过去就没问题的,结果还是手敲英文字符的冒号才过的

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
 #include<iostream>

using namespace std;

int hour_, min_, scd, s;
void cout_help(int x){
if (x < 10)cout << 0 << x;
else cout << x;
}

int main(){
cin >> s;
hour_ = min_ = scd = 0;
if (s < 60){
cout << "00:00:"; cout_help(s);
}
else if (s < 60 * 60){
cout << "00:"; cout_help(s / 60); cout << ":"; cout_help(s % 60);
}
else if (s < 60 * 60 * 24){
scd = s % 60;
min_ = s / 60;
hour_ = min_ / 60;
min_ = min_ % 60;
cout_help(hour_); cout << ":"; cout_help(min_); cout << ":"; cout_help(scd);
}
else{
scd = s % 60;
min_ = s / 60;
hour_ = min_ / 60;
min_ = min_ % 60;
hour_ = hour_ % 24;
cout_help(hour_); cout << ":"; cout_help(min_); cout << ":"; cout_help(scd);
}
cout << endl;
//system("pause");
return 0;
}

问题 B: 找出第n个数

题目

问题 B: 找出第n个数
T时间限制: 1 Sec 内存限制: 128 MB

题目描述
    已知一个无限大的矩阵的前面6行6列如下图所示,现在按红色线条所示的方法给所有数编号,那么前几个数分别为:1 2 2 3 4 3 4 6 6 4 …
现在给定任意的n, 请输出第n个数是多少? n <= 10000

矩阵图

(就是感觉这张图的最后一个数字应该是36才对,感觉有错可能没我想的那么简单,就直接跳去C题了,结果当时C题没A得过……)

输入
    输入包括多行:
第一行:一个整数 t , 表示询问次数
接下来t行,每行一个整数n, 表示问第n个数

输出
    输输出t行,每行一个整数

样例输入
3
3
5
17

样例输出
2
4
10

命题人

    duzhengjun




原题链接

由于我们学校的是内网系统,所以原题链接过不去也正常
More info:Question


AC源码(c++)

2点:

  1. 可以看做是一个金字塔一般的排列顺序:

    第1行(共1个数):(1,1)
    第2行(共2个数):(1,2) (2,1)
    第3行(共3个数):(1,3) (2,2) (3,1)
    第4行(共4个数):(1,4) (2,3) (3,2) (4,1)
    ……
    第x行(共x个数):(1,x) (2,x-1) (3,x-2) (4,x-3) …(x,1)

    所以第n个数可以表示为n=(1+2+…+x)+y的形式;
  2. 对应矩阵图中的ai,j=i* j;
    a[n]=x;(当y=0时)
    a[n]=(x - y) * (y+1);(当y非0时)。
    (其实貌似不用注意公式第1种情况,因为y=0时好像也适用于第二个公式,但是没试过,还是放出来吧就)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<cstring>
    using namespace std;
    const int maxn = 10001;
    int x,y, n, t;
    int main() {
    cin >> t;
    while (t--) {
    cin >> n;
    y = 0; x = 0;
    while ((1 + x) * x / 2 < n) {
    x++;
    }
    y = (1 + x) * x / 2 - n;
    //cout << "x=" <<x << ";" <<"y="<< y << endl;
    if (!y)cout << x << endl;
    else cout << (x - y) * (y+1) << endl;
    }
    return 0;
    }

Author: Zoey

Link: https://zoey1038569979.github.io/2019/08/30/qhuoj_csp3/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
CCF&&CSP 2019-03 (前2道)
NextPost >
关于HDOJ 1330题(Deck) 的理解(C/C++)
CATALOG
  1. 1. 问题 A: 时间都去哪儿了
    1. 1.1. 题目
    2. 1.2. 原题链接
    3. 1.3. AC源码(c++)
  2. 2. 问题 B: 找出第n个数
    1. 2.1. 题目
    2. 2.2. 原题链接
    3. 2.3. AC源码(c++)