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 (1≤n≤104) — 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
思路:深搜的题目,但我那时候深搜没有好好学习,到这里的时候就懵逼了,后面看来要恶补深搜一下还有几道题目,也是咿咿呀呀的不会写了,只能放弃