PAT[乙级]1025-1030
1026 程序运行时间 (15 分)[模拟]
题目描述
要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick,即“时钟打点”。同时还有一个常数 CLK_TCK,给出了机器时钟每秒所走的时钟打点数。于是为了获得一个函数 f 的运行时间,我们只要在调用 f 之前先调用 clock(),获得一个时钟打点数 C1;在 f 执行完成后再调用 clock(),获得另一个时钟打点数 C2;两次获得的时钟打点数之差 (C2-C1) 就是 f 运行所消耗的时钟打点数,再除以常数 CLK_TCK,就得到了以秒为单位的运行时间。
这里不妨简单假设常数 CLK_TCK 为 100。现给定被测函数前后两次获得的时钟打点数,请你给出被测函数运行的时间。
输入格式:
输入在一行中顺序给出 2 个整数 C1 和 C2。注意两次获得的时钟打点数肯定不相同,即 C1 < C2,并且取值在
[
0
,
1
0
7
]
[0,10^7]
[0,107]。
输出格式:
在一行中输出被测函数运行的时间。运行时间必须按照 hh:mm:ss
(即2位的 时:分:秒
)格式输出;不足 1 秒的时间四舍五入到秒。
输入样例:
123 4577973
输出样例:
12:42:59
代码
#include <iostream>
using namespace std;
int main() {
int c1 , c2;
cin >> c1 >> c2;
int c = (c2 - c1 + 50) / 100;//四舍五入
printf("%02d:%02d:%02d",c/3600,c%3600/60,c%3600%60);
// 时 分 秒
return 0;
}
思路:
n 表 示 运 ⾏ 的 时 间 , n 为 ( b − a ) / 100 , 因 为 常 数 C L K T C K 为 100 , 题 ⽬ 要 求 不 ⾜ 1 秒 的 时 间 四 舍 五 ⼊ 到 秒 , 所 以 先 给 ( b − a ) 加 上 50 , 这 样 如 果 ( b − a ) / 100 的 ⼩ 数 位 ⼤ 于 等 于 0.5 则 会 进 位 , ⼩ 于 等 于 0.5 则 会 舍 去 , 所 以 n = ( ( b – a ) + 50 ) / 100 n表示运⾏的时间,n为(b-a)/100,因为常数CLK_TCK为100,题⽬要求不⾜1秒的时间四舍五⼊ 到秒,所以先给(b-a)加上50,这样如果(b-a)/100的⼩数位⼤于等于0.5则会进位,⼩于等于0.5则会舍 去,所以n = ((b – a) + 50) / 100 n表示运⾏的时间,n为(b−a)/100,因为常数CLKTCK为100,题⽬要求不⾜1秒的时间四舍五⼊到秒,所以先给(b−a)加上50,这样如果(b−a)/100的⼩数位⼤于等于0.5则会进位,⼩于等于0.5则会舍去,所以n=((b–a)+50)/100
1027. 打印沙漏(20) [图形打印]
题目描述
题目描述
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
*结尾无空行*
输出样例:
*****
***
*
***
*****
2
*结尾无空行*
代码
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
void f(int h,int i,char ch) {
for(int j = 0 ; j < i ; j++)
cout<<" ";
for(int j = 0 ; j < 2*(h-i)-1 ; j++)
cout << ch;
cout<<endl;
}
int main() {
int n;
cin >> n;
char ch;
cin >> ch;
//2*上半层数^2 -1 = 总数
int h = sqrt((n+1)/2);// h = 上半层 + 中间一层
for(int i = 0 ; i <h ; i++)
f(h,i,ch);
for(int i = h-2 ; i >=0 ; i--)
f(h,i,ch);
cout<<n-2*h*h+1;
return 0;
}
1028. ⼈⼝普查(20) [查找元素]
题目描述
某城镇进⾏⼈⼝普查,得到了全体居⺠的⽣⽇。现请你写个程序,找出镇上最年⻓和最年轻的⼈。这
⾥确保每个输⼊的⽇期都是合法的,但不⼀定是合理的——假设已知镇上没有超过200岁的⽼⼈,⽽今
天是2014年9⽉6⽇,所以超过200岁的⽣⽇和未出⽣的⽣⽇都是不合理的,应该被过滤掉。
输⼊格式:
输⼊在第⼀⾏给出正整数N,取值在(0,
1
0
5
10^5
105];随后N⾏,每⾏给出1个⼈的姓名(由不超过5个英⽂字
⺟组成的字符串)、以及按“yyyy/mm/dd
”(即年/⽉/⽇)格式给出的⽣⽇。题⽬保证最年⻓和最年轻
的⼈没有并列。
输出格式:
在⼀⾏中顺序输出有效⽣⽇的个数、最年⻓⼈和最年轻⼈的姓名,其间以空格分隔。
输⼊样例:
5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20
输出样例:
3 Tom John
代码
#include <iostream>
#include <map>
using namespace std;
/*利用map集合键值对的特性绑定名字和时间*/
int main() {
int n,i = 0;
cin >> n;
map<string , string> m;
while(n--) {
string name , time;
cin >> name >> time;
//string类字符串可以按照字典顺序进行比较大小
if(time >= "1814/09/06" && time <= "2014/09/06") {
++i;//计算与多少个符合条件
m.insert(make_pair(time,name));//存储时间和名字
}
}
if(i)cout << i << " " << m.begin()->second << " " << m.rbegin()->second;
else cout << 0;
return 0;
}
1029. 旧键盘(20) [Hash散列]
题目描述
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入格式:
输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _(代表空格)组成。题目保证 2 个字符串均非空。
输出格式:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。
输入样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI
代码
#include <iostream>
#include <ctype.h>
using namespace std;
int main() {
string s1 , s2,s;
cin >> s1 >> s2;
/*
s1 : 好键盘
s2 : 坏键盘
*/
int k = 0;
for(int i = 0 ; i < s1.size() ; ++i) {//遍历好键盘的字符
if((k = s2.find(s1[i])) == -1 && (k = s.find(toupper(s1[i]))) == -1) {
//在s2中寻找s1中的元素和在s中寻找s1大写的元素
s += toupper(s1[i]);
}
}
cout << s;
return 0;
}
1030. 完美数列(25) [two pointers]
题目描述
给定⼀个正整数数列,和正整数p,设这个数列中的最⼤值是M,最⼩值是m,如果M <= m * p,则称这个数列是完美数列。
现在给定参数p和⼀些正整数,请你从中选择尽可能多的数构成⼀个完美数列。
输⼊格式:
输⼊第⼀⾏给出两个正整数N和p,其中N(<=
1
0
5
10^5
105)是输⼊的正整数的个数,p(<=
1
0
9
10^9
109)是给定的参数。第⼆⾏给出N个正整数,每个数不超过
1
0
9
10^9
109。
输出格式:
在⼀⾏中输出最多可以选择多少个数可以⽤它们组成⼀个完美数列。
输⼊样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
long long n,p,num;//数据较大
cin >> n >> p;
vector<long long> v;
while(n--) {
cin >> num;
v.push_back(num);//利用容器或数组存储,便于访问
}
sort(v.begin() , v.end()); //使得左边为小,右边为大
int result = 0;
for(int i = 0 ; i < v.size() ; ++i) {//最小值
for(int j = i + result ; j < v.size() ; ++j) {//最大值
if(v[j] <= v[i] * p) {
result = max(j - i + 1,result);//我们只要求其最大值,所以下⼀次j只要从i的result个后⾯开始找就⾏了
} else {
break;
}
}
}
cout << result;
return 0;
}
思路:
思路:
-
先
将
其
数
列
进
行
从
小
到
大
(
从
大
到
小
也
一
样
)
排
序
先将其数列进行从小到大(从大到小也一样)排序
先将其数列进行从小到大(从大到小也一样)排序
目 的 : 使 得 其 子 列 左 边 始 终 为 最 小 值 , 右 边 始 终 为 最 大 值 目的:使得其子列左边始终为最小值,右边始终为最大值 目的:使得其子列左边始终为最小值,右边始终为最大值 - 利 用 双 指 针 的 思 想 , 最 小 值 ( i ) 从 0 开 始 遍 历 , 最 大 值 ( j ) 也 从 0 开 始 遍 历 , 先 保 持 i 不 动 , j + + , 不 满 足 条 件 退 出 循 环 , 然 后 i + + ; 利用双指针的思想,最小值(i)从0开始遍历,最大值(j)也从0开始遍历,先保持i不动,j++,不满足条件退出循环,然后i++; 利用双指针的思想,最小值(i)从0开始遍历,最大值(j)也从0开始遍历,先保持i不动,j++,不满足条件退出循环,然后i++;
- 设 置 r e s u l t 变 量 的 目 的 : 获 取 其 子 列 长 度 的 最 大 值 ( 输 出 ) , 下 ⼀ 次 i 的 循 环 j 只 要 从 i 的 r e s u l t 个 后 ⾯ 开 始 找 就 ⾏ 了 设置result变量的目的:获取其子列长度的最大值(输出),下⼀次i的循环j只要从i的result个后⾯开始找就⾏了 设置result变量的目的:获取其子列长度的最大值(输出),下⼀次i的循环j只要从i的result个后⾯开始找就⾏了