《算法笔记》3.1小节——入门模拟->简单模拟

目录

问题 A: 剩下的树

问题 B: A+B

问题 C: 特殊乘法

问题 D: 比较奇偶数个数

问题 E: Shortest Distance (20)

问题 F: A+B和C (15)

问题 G: 数字分类 (20)

问题 H: 部分A+B (15)


 

问题 A: 剩下的树

时间限制: 1 Sec  内存限制: 32 MB
提交: 1682  解决: 673
[提交][状态][讨论版][命题人:外部导入]

题目描述

有一个长度为整数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组整数,每组有一对数字。

输出

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

样例输入

4 2
1 2
0 2
11 2
1 5
4 7
0 0

样例输出

2
5

代码:

#include 

int main()
{
    int l = 0;
    int m = 0;
    int i = 0;
    int j = 0;
    int left = 0;
    int right = 0;
    int a[10001] = {0};
    int count = 0;
    while(scanf("%d%d",&l,&m)!=EOF && l!=0){
        count = 0;
        for(i=0;i<=l;i++){
            a[i] = 1;
        }

        for(i=0;i

 

 

问题 B: A+B

时间限制: 1 Sec  内存限制: 32 MB
提交: 1103  解决: 572
[提交][状态][讨论版][命题人:外部导入]

题目描述

给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。
现在请计算A+B的结果,并以正常形式输出。

输入

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

输出

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

样例输入

-234,567,890 123,456,789
1,234 2,345,678

样例输出

-111111101
2346912
#include 

#include 

int solveNum(char str[]){
    int i = 0;
    int length = strlen(str);
    int num = 0;

    for(i=0;i='0'&&str[i]<='9'){
            num *= 10;
            num += (str[i]-'0');
        }
    }


    if(str[0] == '-'){
        num *= -1;
    }

    return num;
}

int main()
{
    char str1[30] = {0};
    char str2[30] = {0};
    int num1 = 0;
    int num2 = 0;

    while(scanf("%s%s",str1,str2)!=EOF){
        num1 = solveNum(str1);
        num2 = solveNum(str2);
        printf("%d\n",num1+num2);
    }


    return 0;
}

 

 

问题 C: 特殊乘法

时间限制: 1 Sec  内存限制: 32 MB
提交: 838  解决: 543
[提交][状态][讨论版][命题人:外部导入]

题目描述

写个算法,对2个小于1000000000的输入,求结果。特殊乘法举例:123 * 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5

输入

 两个小于1000000000的数

输出

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

样例输入

24 65
42 66666
3 67

样例输出

66
180
39
#include 

using namespace std;

int main()
{
    int a,b=0;
    int num1[11] = {0};
    int num2[11] = {0};
    int length1 = 0;
    int length2 = 0;
    int num = 0;
    int i = 0;
    int j = 0;
    while(cin >> a >> b){
        length1 = 0;
        length2 = 0;
        num = 0;
        if(a==0||b==0){
            cout << 0 << endl;
        }else{

            while(a!=0){
                num1[length1++] = a%10;
                a /= 10;
            }
            while(b!=0){
                num2[length2++] = b%10;
                b /= 10;
            }

            for(i=0;i

 

 

问题 D: 比较奇偶数个数

时间限制: 1 Sec  内存限制: 32 MB
提交: 833  解决: 523
[提交][状态][讨论版][命题人:外部导入]

题目描述

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

输入

 

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

 

输出

 

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

 

样例输入

1
67 
7
0 69 24 78 58 62 64 

样例输出

YES
NO
#include 

using namespace std;

int main()
{
    int odd = 0;
    int even = 0;
    int i = 0;
    int n = 0;
    int num = 0;

    while (cin >> n){
        odd = 0;
        even = 0;
        for(i=0;i> num;
            if(num%2 == 0){
                even ++;
            }else{
                odd ++;
            }
        }

        if(even > odd){
            cout << "NO" <

 

问题 E: Shortest Distance (20)

时间限制: 1 Sec  内存限制: 32 MB
提交: 1223  解决: 396
[提交][状态][讨论版][命题人:外部导入]

题目描述

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, 105]), 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 (<=104), 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.

样例输入

5 1 2 4 14 9
3
1 3
2 5
4 1

样例输出

3
10
7

注:这道题如果用暴力模拟必定超时,所以必须要优化模拟过程,从后往前遍历实际上就是从前往后遍历的坐标互换,抓住这一点实际上逻辑就简单了很多,题目中给的是距离的数据,将其近似转换成一维坐标计算起来会比较方便,也将一部分计算直接放到了输入的遍历中来,之后计算距离的时间复杂度只有O(1)。

#include 

#include 

using namespace std;

int getBest(int distance[],int start,int exit,int n){

    int distance1 = 0;
    int distance2 = 0;
    int position = 0;

    //计算往前走的距离

    if(exit >= start){
        distance1 = distance[exit]-distance[start];
    }else{
        distance1 = ((distance[n] - distance[start]) + (distance[exit] - distance[0]));
    }

    //计算往后走的距离,其实就相当于把exit跟start的位置互换,再用前一种方法算
    position = start;
    start = exit;
    exit = position;

    if(exit >= start){
        distance2 = distance[exit]-distance[start];
    }else{
        distance2 = ((distance[n] - distance[start]) + (distance[exit] - distance[0]));
    }

    return distance1 < distance2 ? distance1:distance2;

}

int main()
{
    int n = 0;
    int m = 0;
    int *distance;
    int start = 0;
    int exit = 0;
    int i = 0;
    cin >> n;

    distance = (int *)malloc(n*sizeof(int)+2);

    //将复杂的距离转换为一维坐标,假设第一个点为坐标原点,只不过最后一个点到原点的距离不能按照一维计算
    for(i=1;i<=n;i++){
        cin >> distance[i];
        distance[i] += distance[i-1];
    }
    cin >> m;
    for(i=0;i> start >> exit;
        cout << getBest(distance,start-1,exit-1,n) << endl;
    }


    return 0;
}

 

问题 F: A+B和C (15)

时间限制: 1 Sec  内存限制: 32 MB
提交: 1446  解决: 515
[提交][状态][讨论版][命题人:外部导入]

题目描述

给定区间[-231, 231]内的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开始)。

样例输入

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 

using namespace std;

int main()
{
    long long a = 0;
    long long b = 0;
    long long c = 0;
    int t = 0;
    int i = 0;
    while(cin >> t){
        for(i=0;i> a >> b >> c;
            if(c < a+b){
                cout << "Case #" << i+1 <<": true" <

 

问题 G: 数字分类 (20)

时间限制: 1 Sec  内存限制: 32 MB
提交: 1480  解决: 427
[提交][状态][讨论版][命题人:外部导入]

题目描述

给定一系列正整数,请按要求对数字进行分类,并输出以下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”。

样例输入

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

样例输出

30 11 2 9.7 9
N 11 2 N 9
#include 
#include 
using namespace std;

int main()
{
    int n = 0;
    int num = 0;
    int a[5] = {0};
    int a_flag[5] = {0};
    int a2_multi = 1;
    int a4_num = 0;
    int i = 0;
    while(cin >> n){
        //初始化
        a2_multi = 1;
        a4_num = 0;

        for(i=0;i<5;i++){
            a[i] = 0;
            a_flag[i] = 0;
        }

        for(i=0;i> num;

            if(num % 10 == 0){
                a[0] += num;
                a_flag[0] ++;
            }
            switch(num%5)
            {
                case 1:
                    a[1] += (a2_multi * num);
                    a2_multi *= -1;
                    a_flag[1] ++;
                    break;
                case 2:
                    a[2] ++;
                    a_flag[2] ++;
                    break;
                case 3:
                    a[3] += num;
                    a4_num ++;
                    a_flag[3] ++;
                    break;
                case 4:
                    if(a[4] < num){
                        a[4] = num;
                        a_flag[4] ++;
                    }
                    break;
            }
        }



        for(i=0;i<3;i++){
            if(a_flag[i] !=0){
                printf("%d ",a[i]);
            }else{
                printf("N ");
            }
        }

        if(a_flag[3] !=0){
            printf("%.1f ",a[3]*1.0/a4_num);
        }else{
            printf("N ");
        }

        if(a_flag[4] !=0){
            printf("%d\n",a[4]);
        }else{
            printf("N\n");
        }

    }

    return 0;
}

 

问题 H: 部分A+B (15)

时间限制: 1 Sec  内存限制: 32 MB
提交: 598  解决: 415
[提交][状态][讨论版][命题人:外部导入]

题目描述

正整数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 < 1010。

输出

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

样例输入

3862767 6 13530293 3
3862767 1 13530293 8

样例输出

399
#include 

using namespace std;

int getP(int n,int d){

    int result = 0;

    while(n!=0){

        if(n%10 == d){
            result *= 10;
            result += d;
        }

        n /= 10;
    }

    return result;
}

int main()
{
    int a = 0;
    int da = 0;
    int b = 0;
    int db = 0;

    while(cin >> a >> da >> b >> db){

        cout << getP(a,da) + getP(b,db) << endl;

    }


    return 0;
}

 

你可能感兴趣的:(算法笔记)