算法笔记 第3章 入门篇(1) 学习笔记(更新中。。。)

本人双非计算机专硕研一在读,由于导师放养,开始放飞自我。。。野蛮生长。。。早早开始刷题,为找工作做准备~

3.1简单模拟

模拟题是一类"题目怎么说,你就怎么做"的题目。这类题目不涉及算法,完全只是根据题目描述来进行代码的编写,考查的是代码能力。

 
PAT B1001 害死人不偿命的(3n+1)猜想 (15 分)

卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 ( 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (,以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

输入格式:

每个测试输入包含 1 个测试用例,即给出正整数 n 的值。

输出格式:

输出从 n 计算到 1 需要的步数。

输入样例:

3

输出样例:

5
#include<cstdio>
int main(){
    int n,step = 0;
    scanf("%d",&n);
    while(n!=1){
        if(n %2 ==0)
            n = n/2;
        else
            n=(3*n+1)/2;
        step++;
    }
    printf("%d\n",step);
    return 0;
}

PAT B1032

为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。

扫描二维码关注公众号,回复: 7910396 查看本文章

输入格式:

输入在第 1 行给出不超过 1 的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。

输出格式:

在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。

输入样例:

6
3 65
2 80
1 100
2 70
3 40
3 0

输出样例:

2 150

#include<cstdio>
int main(){
    int n;
    int maxn = 100010;
    int school[maxn] = {0};
    int schid,mark;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d%d",&schid,&mark);
        school[schid] += mark;
    }
    int maxid,MAX=-1;
    for(int i=1;i<=n;i++){
        if(school[i]>MAX){
            MAX = school[i];
            maxid = i;
        }
    }
    printf("%d %d",maxid,MAX);
    return 0;
}

B1011 A+B和C

给定区间 [−] 内的 3 个整数 A、B 和 C,请判断 A+B 是否大于 C。

输入格式:

输入第 1 行给出正整数 T (≤),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。

输出格式:

对每组测试用例,在一行中输出 Case #X: true 如果 A+B>C,否则输出 Case #X: false,其中 X 是测试用例的编号(从 1 开始)。

输入样例:

4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647

输出样例:

Case #1: false
Case #2: true
Case #3: true
Case #4: false
#include<cstdio>
int main(){
    int T,tcase = 1;
    scanf("%d",&T);
    long long a,b,c;
    while(T--){
        scanf("%lld%lld%lld",&a,&b,&c);
        if(a+b>c){
            printf("Case #%d: true\n",tcase++);
        }else{
            printf("Case #%d: false\n",tcase++);
        }
    }
    return 0;
}

B1016 部分A+B 

正整数 A 的“DA​​(为 1 位整数)部分”定义为由 A 中所有 DA​​ 组成的新整数 PA​​。例如:给定 8,DA​​=6,则 A 的“6 部分”PA​​ 是 66,因为 A 中有 2 个 6。

现给定 A、DA​​、B、DB​​,请编写程序计算 PA​​+PB​​。

输入格式:

输入在一行中依次给出 A、DA​​、B、DB​​,中间以空格分隔,其中 0。

输出格式:

在一行中输出 PA​​+PB​​ 的值。

输入样例 1:

3862767 6 13530293 3

输出样例 1:

399

输入样例 2:

3862767 1 13530293 8

输出样例 2:

0

#include<cstdio>
int main(){
    long long A,DA,B,DB;
    scanf("%lld%lld%lld%lld",&A,&DA,&B,&DB);
    long long PA = 0,PB=0;
    while(A!=0){
        if(A%10==DA)
            PA = PA*10+DA;
        A /= 10;
    }
    
    while(B!=0){
        if(B%10==DB)
            PB = PB*10+DB;
        B /= 10;
    }
    printf("%lld",PA+PB);
    return 0;
}

B1026 程序运行时间 

要获得一个 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,并且取值在 [。

输出格式:

在一行中输出被测函数运行的时间。运行时间必须按照 hh:mm:ss(即2位的 时:分:秒)格式输出;不足 1 秒的时间四舍五入到秒。

输入样例:

123 4577973

输出样例:

12:42:59
#include<cstdio>
int main(){
    int c1,c2;
    scanf("%d%d",&c1,&c2);
    int ans = c2-c1;
    if(ans%100 >= 50){
        ans = ans/100 + 1;
    }else{
        ans = ans/100;
    }
    printf("%02d:%02d:%02d",ans/3600,ans%3600/60,ans%60);
    return 0;
}

B 1046 划拳

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。

输入格式:

输入第一行先给出一个正整数 N(≤),随后 N 行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划

其中是喊出的数字,是划出的数字,均为不超过 100 的正整数(两只手一起划)。

输出格式:

在一行中先后输出甲、乙两人喝酒的杯数,其间以一个空格分隔。

输入样例:

5
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15

输出样例:

1 2
#include<cstdio>
int main(){
    int n,faila=0,failb=0;
    int a1,a2,b1,b2;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d%d%d%d",&a1,&a2,&b1,&b2);
        if(a1+b1==a2 && a1+b1!=b2){
            failb++;
        }
        if(a1+b1!=a2 && a1+b1==b2){
            faila++;
        }
    }
    printf("%d %d",faila,failb);
    return 0;
}
 

猜你喜欢

转载自www.cnblogs.com/coderying/p/11891827.html
今日推荐