3.1 简单模拟

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

卡拉兹(Callatz)猜想:

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

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

输入格式:

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

输出格式:

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

输入样例:

3

输出样例:

5

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

PAT B1032 挖掘机技术哪家强

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

输入格式:

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

输出格式:

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

输入样例:

6

3 65

2 80

1 100

2 70

3 40

3 0

输出样例:

2 150

#include<stdio.h>
int sum[100005]={};                        //记录每个学校的总分;{0},{},将数组初始化为全0
int main()
{
    int n;                                //参赛人数n
    int id;                               //学校编号
    int s;                                //参赛选手成绩
    int max=0;                            //最高成绩初始化为0
    scanf("%d",&n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d %d",&id,&s);
        sum[id]+=s;
    }
    for (int i = 1; i <= n; i++)         //i从1开始,以为学校编号从一开始
    {
        if (max<sum[i])
        {
            max=sum[i];
            id=i;
        }
        
    }
    printf("%d %d\n",id,max);
    return 0;
} 

codeup 简单模拟 问题 A: 剩下的树

题目描述

有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,...,L共L+1个位置上有L+1棵树。

现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。

可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。

输入

两个整数L(1<=L<=10000)和M(1<=M<=100)。

接下来有M组整数,每组有一对数字。 

输出

可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。

样例输入 Copy

4 2

1 2

0 2

11 2

1 5

4 7

0 0

样例输出 Copy

2

5

#include <stdio.h>

int main()

{

    int l, m;

    while ((scanf("%d%d", &l, &m)) && l > 0 && m > 0)

    {

        int a[l + 1] = {};                  //初始化a[0]-a[l]为0

        int ans = 0;

        while (m--)

        {

            int b[2] = {0};                //要移走的两端

            scanf("%d%d", &b[0], &b[1]);

            for (int i = b[0]; i <= b[1]; i++)

            {

                a[i] = 1;                  //移走部分置1

            }

        }

        for (int i = 0; i <= l; i++)

        {

            if (a[i] == 0)                //a[i]=0,该位置有树

            {

                ans++;

            }

        }

        printf("%d\n", ans);

    }

 

    return 0;

}

codeup 简单模拟 问题 B: A+B

题目描述

给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。

现在请计算A+B的结果,并以正常形式输出。

输入

输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9)。

输出

请计算A+B的结果,并以正常形式输出,每组数据占一行。

样例输入 Copy

-234,567,890 123,456,789

1,234 2,345,678

样例输出 Copy

-111111101

2346912

1.整数数据类型取值范围

2.数字字符转换为数字

#include <stdio.h>
#include <string.h>
int transform(char s[])
{
    int len = strlen(s);
    int sum = 0;
    int j = 1;
    for (int i = len - 1; i >= 0; i--)                 
    {
        if (s[i] >= '0' && s[i] <= '9')               //注意要与字符'0','9'比较,而不是与数字0,9比较
        {
            sum += (int)(s[i] - '0') * j;            //与字符'0'相减  
            j *= 10;
        }
    }
    if (s[0] == '-')
    {
        sum = -sum;
    }
    return sum;
}
int main()
{
    char str1[25];
    char str2[25];
    while ((scanf("%s %s", str1, str2) != EOF))
    {
        int a = transform(str1);
        int b = transform(str2);
        printf("%d\n", a + b);
    }

    return 0;
}

codeup 简单模拟 问题 C: 特殊乘法

题目描述

写个算法,对2个小于1000000000的输入,求结果。特殊乘法举例:123 * 45 = 14 +15 +24 +25 +34+35

输入

两个小于1000000000的数

输出

输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。

样例输入 Copy

24 65

42 66666

3 67

样例输出 Copy

66

180

39

#include <stdio.h>
#include <string.h>
int main()
{
    char str1[20];
    char str2[20];
    while ((scanf("%s %s", str1, str2) != EOF))
    {
        int sum = 0;
        int len1 = strlen(str1);
        int len2 = strlen(str2);
        for (int i = 0; i < len1; i++)
        {
            for (int j = 0; j < len2; j++)
            {
                sum += ((str1[i] - '0') * (str2[j] - '0'));
            }
        }
        printf("%d\n", sum);
    }

    return 0;
}

codeup 简单模拟 问题 D: 比较奇偶数个数

题目描述

第一行输入一个数,为n,第二行输入n个数,这n个数中,如果偶数比奇数多,输出NO,否则输出YES。

输入

输入有多组数据。

每组输入n,然后输入n个整数(1<=n<=1000)。

输出

如果偶数比奇数多,输出NO,否则输出YES。

样例输入 Copy

1

67

7

0 69 24 78 58 62 64

样例输出 Copy

YES

NO

#include <stdio.h>
int main()
{
    int n;
    while ((scanf("%d", &n)) != EOF)
    {
        int a[n];
        int cnt1 = 0; //奇数
        int cnt2 = 0; //偶数
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
            if (a[i] % 2 == 1)
            {
                cnt1++;
            }
            else
            {
                cnt2++;
            }
        }
        if (cnt1 >= cnt2)
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }

    return 0;
}

codeup 简单模拟 问题 E: Shortest Distance (20)

题目描述

The task is really simple: given N exits on a highway which forms a simple cycle,

you are supposed to tell the shortest distance between any pair of exits.

输入

Each input file contains one test case. For each case,

the first line contains an integer N (in [3, 10^5]), followed by N integer distances D1 D2 ... DN,

where Di is the distance between the i-th and the (i+1)-st exits, and DN is between the N-th and the 1st exits.

All the numbers in a line are separated by a space. The second line gives a positive integer M (<=10^4),

with M lines follow, each contains a pair of exit numbers, provided that the exits are numbered from 1 to N.

It is guaranteed that the total round trip distance is no more than 107.

输出

For each test case, print your results in M lines,

each contains the shortest distance between the corresponding given pair of exits.

样例输入 Copy

5 1 2 4 14 9

3

1 3

2 5

4 1

样例输出 Copy

3

10

7

d[i]记录第1个结点(下标从1开始)到第i+1个结点的距离

sum为环形总长

ans1:为顺时针距离(假设输入为顺时针方向)

ans2:sum-ans1

最后输出ans1和ans2中较小的

#include <stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    int sum = 0;
    int d[n + 1] = { };
    for (int i = 1; i <= n; i++)
    {
        int temp;
        scanf("%d", &temp);
        sum += temp;
        d[i] = sum;
    }
    int cnt;
    scanf("%d", &cnt);
    for (int i = 0; i < cnt; i++)
    {
        int begin, end;
        scanf("%d %d", &begin, &end);
        if (begin > end)
        {
            int temp = begin;
            begin = end;
            end = temp;
        }
        int ans1 = d[end - 1] - d[begin - 1];
        int ans2 = sum - ans1;
        if (ans1 < ans2)
        {
            printf("%d\n", ans1);
        }
        else
        {
            printf("%d\n", ans2);
        }
    }

    return 0;
}

codeup 简单模拟 问题 F: A+B和C (15)

题目描述

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

输入

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

输出

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

样例输入 Copy

4

1 2 3

2 3 4

2147483647 0 2147483646

0 -2147483648 -2147483647

样例输出 Copy

Case #1: false

Case #2: true

Case #3: true

Case #4: false

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    for (int i = 1; i <= t; i++)
    {                                                 //int -2*10^9~2*10^9
        long long a,b,c;                             //long long -9*10^18~9*10^18
        scanf("%lld %lld %lld",&a,&b,&c);            //int %d  long long %lld
        if (a+b>c)
        {
            printf("Case #%d: true\n",i);
        }
        else
        {
            printf("Case #%d: false\n",i);
        }
        
    }
    
    return 0;
}

codeup 简单模拟 问题 G: 数字分类 (20)

题目描述

给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:

A1 = 能被5整除的数字中所有偶数的和;

A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;

A3 = 被5除后余2的数字的个数;

A4 = 被5除后余3的数字的平均数,精确到小数点后1位;

A5 = 被5除后余4的数字中最大数字。

输入

每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的正整数。数字间以空格分隔。

输出

对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。

若其中某一类数字不存在,则在相应位置输出“N”。

样例输入 Copy

13 1 2 3 4 5 6 7 8 9 10 20 16 18

8 1 2 4 5 6 7 9 16

样例输出 Copy

30 11 2 9.7 9

N 11 2 N 9

/*
起个大早做了这道题,真是菜呀,一看就会,一写就错

注意:

1.A2,虽然这类数的个数不为0,但是结果加减相消可能为0

2.A4.求平均,分母不能为0,不存在这类数则不能求平均

a[1]-a[5] 存 结果 A1-A5

cnt[1]-cnt[5] 存 对应数字数量
*/
#include <stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    int b[n];
    int a[6] = {0};
    int cnt[6] = {0};
    int max = 0;
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &b[i]);
        if (b[i] % 10 == 0)
        {
            a[1] += b[i];
            cnt[1]++;
        }
        if (b[i] % 5 == 1)
        {
            if (cnt[2]%2==0)
            {
                a[2]+=b[i];
            }
            else
            {
                a[2]-=b[i];
            }
            cnt[2]++;
        }
        if (b[i] % 5 == 2)
        {
            cnt[3]++;
            a[3]++;
        }
        if (b[i] % 5 == 3)
        {
            cnt[4]++;
            a[4] += b[i];
        }
        if (b[i] % 5 == 4)
        {
            cnt[5]++;
            if (b[i] > max)
            {
                max=b[i];             //最后的最后发现这里写的有问题,第一遍为:a[5]=b[i];  明显的写错了,居然最后才看出来
                a[5]=max;
            }
        }
    }
    for (int i = 1; i <= 5; i++)
    {
        if (i < 5 && cnt[i] == 0)
        {
            printf("N ");
        }
        else if (i == 5 && cnt[i] == 0)
        {
            printf("N");
        }
        if (i < 5 && cnt[i] != 0)
        {
            if (i == 4)
            {
                printf("%.1f ", a[4] / (cnt[4] * 1.0));
            }
            else
            {
                printf("%d ", a[i]);
            }
        }
        else if (i == 5 && cnt[i] != 0)
        {
            printf("%d", a[i]);
        }
    }
    return 0;
}

codeup 简单模拟 问题 H: 部分A+B (15)

[命题人 : 外部导入]

时间限制 : 1.000 sec 内存限制 : 32 MB

题目描述

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

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

输入

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

输出

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

样例输入 Copy

3862767 6 13530293 3

3862767 1 13530293 8

样例输出 Copy

399

0

#include <stdio.h>
#include <string.h>
int main()
{
    char a[15];
    char b[15];
    int da, db;
    long long pa = 0;
    long long pb = 0;
    scanf("%s %d %s %d", &a, &da, &b, &db);
    int len1 = strlen(a);
    int len2 = strlen(b);
    for (int i = len1 - 1; i >= 0; i--)
    {
        if ((a[i] - '0') == da)
        {
            pa = pa * 10 + da;     //第一遍写成了 pa+=pa*10+da;  
        }                          //应该为pa=pa*10+da 6->6*10+6=66
    }
    for (int i = len2 - 1; i >= 0; i--)
    {
        if ((b[i] - '0') == db)
        {
            pb = pb * 10 + db;
        }
    }
    printf("%lld", pa+pb);
    return 0;
}

codeup 简单模拟 问题 I: 锤子剪刀布 (20)

[命题人 : 外部导入]

时间限制 : 1.000 sec 内存限制 : 32 MB

题目描述

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入

输入第1行给出正整数N(<=10^5),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。

C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。

输出

输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。

第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不唯一,则输出按字母序最小的解。

样例输入 Copy

10

C J

J B

C B

B B

B C

C C

C B

J B

B C

J J

样例输出 Copy

5 3 2

2 3 5

B B

/*对不起是我太菜了
此题需要注意:1.scanf()以Space、Enter、Tab结束一次输入,此题多组数据中有回车不能用scanf()  
https://blog.csdn.net/zqixiao_09/article/details/50189477
2.第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不唯一,则输出按字母序最小的解。
字典序呀,不要瞎搞一通,看题
*/
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    scanf("%d", &n);
    int cnt1[3] = {0};                         //cnt1,cnt2存甲乙某种手势赢的次数
    int cnt2[3] = {0};
    int win1 = 0;                             //win1,win2存甲乙赢得总次数
    int win2 = 0;
    for (int i = 0; i < n; i++)
    {
        char s1, s2;                          //存甲乙一次猜拳中的手势
        cin >> s1 >> s2;
        if (s1 == 'B' && s2 == 'C')
        {
            win1++;
            cnt1[0]++;
        }
        if (s1 == 'C' && s2 == 'J')
        {
            win1++;
            cnt1[1]++;
        }
        if (s1 == 'J' && s2 == 'B')
        {
            win1++;
            cnt1[2]++;
        }
        if (s2 == 'B' && s1 == 'C')
        {
            win2++;
            cnt2[0]++;
        }
        if (s2 == 'C' && s1 == 'J')
        {
            win2++;
            cnt2[1]++;
        }
        if (s2 == 'J' && s1 == 'B')
        {
            win2++;
            cnt2[2]++;
        }
    }
    printf("%d %d %d\n", win1, n - win1 - win2, win2);
    printf("%d %d %d\n", win2, n - win1 - win2, win1);
    int max1 = cnt1[0] >= cnt1[1] ? 0 : 1;           //max1,max2存甲乙获胜最多的手势
    max1 = cnt1[max1] >= cnt1[2] ? max1 : 2;
    int max2 = cnt2[0] >= cnt2[1] ? 0 : 1;
    max2 = cnt2[max2] >= cnt2[2] ? max2 : 2;
    char str[3] = {'B', 'C', 'J'};
    printf("%c %c\n", str[max1], str[max2]);
    return 0;
}
posted @ 2020-02-23 11:01  凯在想peach  阅读(180)  评论(0编辑  收藏  举报