算法笔记 第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
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 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

2 150

#include
int main(){
    int n;
    int maxn = 100010;
    int school[maxn] = {0};
    int schid,mark;
    scanf("%d",&n);
    for(int i=0;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
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
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
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
int main(){
    int n,faila=0,failb=0;
    int a1,a2,b1,b2;
    scanf("%d",&n);
    for(int i=0;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;
}

 3.2 查找元素

给定一些元素,然后查找某个满足某条件的元素。

codeup 1934

题目描述

输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。

输入

测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。

输出

对于每组输入,请输出结果。

样例输入

4
1 2 3 4
3

样例输出

2
 
#include
const int maxn = 210;
int a[maxn];
int main(){
    int n,x;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i){
            scanf("%d",&a[i]);
        }
        scanf("%d",&x);
        int k;
        for(k=0;k){
            if(a[k]==x){
                printf("%d\n",k);
                break;
            }
        }
        if(k==n){
            printf("-1\n");
        }
    }
    return 0;
}

3.3 图形输出

PAT B1036 跟奥巴马一起编程

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!

输入格式:

输入在一行中给出正方形边长 N(3)和组成正方形边的某种字符 C,间隔一个空格。

输出格式:

输出由给定字符 C 画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的 50%(四舍五入取整)。

输入样例:

10 a

输出样例:

aaaaaaaaaa
a        a
a        a
a        a
aaaaaaaaaa
#include
int main(){
    int row,col;
    char c;
    scanf("%d %c",&col,&c);
    for(int i=0;i){
        printf("%c",c);
    }
    printf("\n");
    if(col%2==1)
        row = col/2 +1;
    else
        row = col/2;
    for(int i=0;i2;i++){
        printf("%c",c);
        for(int k=0;k2;k++){
            printf(" ");
        }
        printf("%c\n",c);
    }    
    for(int i=0;i){
        printf("%c",c);
    }
    
    return 0;
}

3.4 日期处理

题目描述

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

输入

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出

每组数据输出一行,即日期差值

样例输入

20130101
20130105

样例输出

5

#include
int month[13][2] = {{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},
                    {30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
bool isLeap(int year){
    return ((year%4==0 && year%100!=0) || year%400==0);
}
int main(){
    int time1,time2;
    while(scanf("%d%d",&time1,&time2)!=EOF){
        if(time1>time2){
            int temp = time1;
            time1 = time2;
            time2 = temp;
        }
        int year1,month1,day1;
        int year2,month2,day2;
        year1 = time1 / 10000;
        year2 = time2 / 10000;
        month1 = time1 % 10000 / 100;
        month2 = time2 % 10000 / 100;
        day1 = time1 % 100;
        day2 = time2 % 100;
        int ans=1;
        while( year1 < year2|| month1day2){
            day1++;
            if(day1 == month[month1][isLeap(year1)] + 1){
                month1++;
                day1 = 1;
            }
            if(month1 == 13){
                year1 ++ ;
                month1 = 1;
            }
            ans++;
        }
        printf("%d\n",ans);
        
    }
    return 0;
}

3.5 进制转换

 

你可能感兴趣的:(算法笔记 第3章 入门篇(1) 学习笔记(更新中。。。))