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 nn(ba)/100CLKTCK1001(ba)50(ba)/1000.50.5n=((ba)+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;
}

思路:

思路:

  1. 先 将 其 数 列 进 行 从 小 到 大 ( 从 大 到 小 也 一 样 ) 排 序 先将其数列进行从小到大(从大到小也一样)排序 ()
    目 的 : 使 得 其 子 列 左 边 始 终 为 最 小 值 , 右 边 始 终 为 最 大 值 目的:使得其子列左边始终为最小值,右边始终为最大值 :使,
  2. 利 用 双 指 针 的 思 想 , 最 小 值 ( i ) 从 0 开 始 遍 历 , 最 大 值 ( j ) 也 从 0 开 始 遍 历 , 先 保 持 i 不 动 , j + + , 不 满 足 条 件 退 出 循 环 , 然 后 i + + ; 利用双指针的思想,最小值(i)从0开始遍历,最大值(j)也从0开始遍历,先保持i不动,j++,不满足条件退出循环,然后i++; ,(i)0,(j)0,i,j++,退,i++;
  3. 设 置 r e s u l t 变 量 的 目 的 : 获 取 其 子 列 长 度 的 最 大 值 ( 输 出 ) , 下 ⼀ 次 i 的 循 环 j 只 要 从 i 的 r e s u l t 个 后 ⾯ 开 始 找 就 ⾏ 了 设置result变量的目的:获取其子列长度的最大值(输出),下⼀次i的循环j只要从i的result个后⾯开始找就⾏了 result:(),ijiresult
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值