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

来源:互联网 发布:人生三大错觉知乎 编辑:程序博客网 时间:2024/04/27 13:56

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

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

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

0 0
原创粉丝点击