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