第三届H-star 程序设计竞赛决赛题解

1.Vanya and Cubes:Vanya got n cubes. He decided to build a pyramidfrom them. Vanya wants to build the pyramid as follows: the top level of thepyramid must consist of 1 cube,the second level must consist of 1+2=3 cubes,the third level must have 1+2+3=6 cubes,and so on. Thus, the i-th level ofthe pyramid must have 1+2+...+(i-1)+i cubes

Vanya wants to know what is the maximumheight of the pyramid that he can make using the given cubes.

输入

The first line contains integer n (1n104) — the number of cubes given to Vanya.

输出

Print the maximum possible height of the pyramid in thesingle line.

样例输入

1

样例输出

1

提示

Sample Input:

25

Sample Output

4

 题意:不难吧,签到题目,一个求和公式计算+枚举

代码:

<span style="font-size:14px;">#include <iostream>
#include <cstdio>
 
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    int i;
    int sum = 0;
    for(i  = 1;; i++)
    {
        sum += i*(i+1)/2;
        if(sum == n)
        {
          cout << i << endl;
          break;
        }
        if(sum > n){
             cout << i-1 << endl;
          break;
        }
 
    }
 
    return 0;
}</span>
2.

2.Milking Cows:三 个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始, 在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的 无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。
你的任务是编一个程序,读入一个有民(1 <= N <= 5000)挤N头牛的工作时间列表,计算以下两点(均以秒为单位):
§最长至少有一人在挤奶的时间段。
§最长的无人挤奶的时间段。(从有人挤奶开始算起)

输入

§第1行:一个整数N。
§ 第2至第N+1行:每行两个小于1000000的非负整数,表示一个农民的开始时刻与结束时刻。

输出

一行,两个整数,即题目所要求的两个答案。

样例输入

3

300 1000

700 1200

1500 2100

样例输出

900 300

思路:就是先对区间按开始的时间排序,然后进行比较和更新区间的开始末了值

代码:

<span style="font-size:14px;">#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
 
using namespace std;
 
int n;
struct point
{
    long long st;
    long long et;
    bool operator < (const point &a) const
    {
        if(st == a.st)
        {
            return et < a.et;
        }
        return st < a.st;
    }
} p[10000];
 
int main()
{
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        cin >> p[i].st >> p[i].et;
    }
    sort(p,p+n);
    long long  s1 = 0;
    long long  s2 = 0;
    for(int i = 1; i <= n; i++)
    {
        s1 = max(s1,p[i-1].et-p[i-1].st);
        if(p[i-1].et < p[i].st)
        {
            s2 = max(s2,p[i].st-p[i-1].et);
        }
        if( p[i].st <= p[i-1].et)
        {
            s1 = max(s1,p[i].et-p[i-1].st);
            p[i].et = max(p[i].et,p[i-1].et);
            p[i].st = min(p[i].st,p[i-1].st);
        }
        if( p[i].st == p[i-1].et)
        {
            p[i].st = p[i-1].st;
 
        }
    }
        cout << s1 << " " <<  s2 << endl;
        return 0;
    }</span>

3.Trie树:小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。
这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能对于每一个我给出的字符串,都在这个词典里面找到以这个字符串开头的所有单词呢?”
身经百战的小Ho答道:“怎么会不能呢!你每给我一个字符串,我就依次遍历词典里的所有单词,检查你给我的字符串是不是这个单词的前缀不就是了?”
小Hi笑道:“你啊,还是太年轻了!~假设这本词典里有10万个单词,我询问你一万次,你得要算到哪年哪月去?”
小Ho低头算了一算,看着那一堆堆的0,顿时感觉自己这辈子都要花在上面了...
小Hi看着小Ho的囧样,也是继续笑道:“让我来提高一下你的知识水平吧~你知道树这样一种数据结构么?”
小Ho想了想,说道:“知道~它是一种基础的数据结构,就像这里说的一样!”
小Hi满意的点了点头,说道:“那你知道我怎么样用一棵树来表示整个词典么?”
小Ho摇摇头表示自己不清楚。
提示一:Trie树的建立
“你看,我们现在得到了这样一棵树,那么你看,如果我给你一个字符串ap,你要怎么找到所有以ap开头的单词呢?”小Hi又开始考校小Ho。
“唔...一个个遍历所有的单词?”小Ho还是不忘自己最开始提出来的算法。
“笨!这棵树难道就白构建了!”小Hi教训完小Ho,继续道:“看好了!”
提示二:如何使用Trie树
提示三:在建立Trie树时同时进行统计!
“那么现在!赶紧去用代码实现吧!”小Hi如是说道

输入

输入的 第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组 成,可能存在相同的单词,此时应将其视作不同的单词。接下来的一行为一个正整数m,表示小Hi询问的次数,其后m行,每一行一个字符串,该字符串由不超过 10个的小写英文字母组成,表示小Hi的一个询问。
n, m<=100000,词典的字母表大小<=26.

输出

于小Hi的每一个询问,输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数。

样例输入

5

babaab

babbbaaaa

abba

aaaaabaa

babaababb

5

babb

baabaaa

bab

bb

bbabbaab

样例输出

1

0

3

0

0

提示

思路:直接模拟去找那些以他开头的字母, 这个题目应该很难,但主办方的数据很弱,模拟写法都过了

代码:

<span style="font-size:14px;">#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
 
using namespace std;
 
int n,m;
char ci[10005][102];
char c[30];
char dd[30];
 
int main()
{
    cin >> n;
    for(int i = 0;i < n;i++){
        cin >> ci[i];
    }
    cin >> m;
    while(m--){
        cin >> c;
        int d = strlen(c);
        int sum = 0;
 
        for(int i = 0;i < n;i++){
            for(int j = 0;j < d;j++){
                dd[j] = ci[i][j];
            }
            if(strcmp(dd,c) == 0){
                sum++;
            }
            memset(dd,0,sizeof(dd));
        }
        cout << sum << endl;
    }
    return 0;
}</span>

 4.Ordered Fractions:输入一个自然数N,对于一个最简分数a/b(分子和分母互质的分数),满足1<=b<=N,0<=a/b<=1,请找出所有满足条件的分数。
这有一个例子,当N=5时,所有解为:
0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
给定一个自然数N,1<=n<=160,请编程按分数值递增的顺序输出所有解。
注:①0和任意自然数的最大公约数就是那个自然数②互质指最大公约数等于1的两个自然数。

输入

单独的一行 一个自然数N(1..160)

输出

每个分数单独占一行,按照大小次序排列

样例输入

5

样例输出

0/1

1/5

1/4

1/3

2/5

1/2

3/5

2/3

3/4

4/5

1/1

提示

思路:哈哈,这题最简单啦,直接结构体排序输出,加入结构体的数按题一进行判断就好了

代码:

<span style="font-size:14px;">#include <iostream>
#include <stdio.h>
#include <algorithm>
 
using namespace std;
 
int gcd(int x,int y){
    return x%y == 0 ? y:gcd(y,x%y);
}
int n;
struct point {
    int x;
    int y;
    double s;
    bool operator < (const point &a)const{
        return s < a.s;
    }
}p[1000006];
 
int main()
{
    cin >> n;
    int k = 1;
    for(int i = 1;i <= n;i++){
            p[0].x = 0;
            p[0].y = 1;
            p[0].s = 0;
        for(int j = 1;j <= i;j++){
            int t = gcd(i,j);
            if(t == 1){
                p[k].x = j;
                p[k].y = i;
                p[k++].s = j*1.0/i;
            }
        }
    }
    sort(p,p+k);
    for(int i = 0;i < k;i++){
        cout << p[i].x << "/" << p[i].y << endl;
    }
 
    return 0;
}</span>

5.Zero Sum:请 考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字组合在一起(请不要在第一个数字前插入符号)。 计算该表达式的结果并判断其值是否为0。 请你写一个程序找出所有产生和为零的长度为N的数列。

输入

单独的一行表示整数N (3 <= N <= 9)。

输出

按照ASCII码的顺序,输出所有在每对数字间插入“+”, “-”, 或 “ ”后能得到结果为零的数列。

样例输入

7

样例输出

1+2-3+4-5-6+7

1+2-3-4+5+6-7

1-2 3+4+5+6+7

1-2 3-4 5+6 7

1-2+3+4-5+6-7

1-2-3-4-5+6+7

思路:深搜的题目,但我那时候深搜没有好好学习,到这里的时候就懵逼了,后面看来要恶补深搜一下

还有几道题目,也是咿咿呀呀的不会写了,只能放弃

你可能感兴趣的:(第三届,H-star)