Coursera C程序设计进阶 第二周

1 . 寻找下标

注意:总时间限制;1000ms 内存限制;65536kB

  描述

      已知一个整数数组x[],其中的元素彼此都不相同。找出给定的数组中是否有一个元素满足x[i]=i的关系,数组下标从0开始。
      举例而言,如果x[]={-2,-1,7,3,0,8},则x[3] = 3,因此3就是答案。

  输入

      第一行包含一个整数n (0 < n < 100),表示数组中元素的个数。
      第二行包含n个整数,依次表示数组中的元素。

  输出

      输出为一个整数,即满足x[i]=i的元素,若有多个元素满足,输出第一个满足的元素。若没有元素满足,则输出“N”。

  样例输入

第一组
6
-2 -1 7 3 4 8
第二组
6
9 9 9 9 9 9


  样例输出

第一组
3
第二组
N


  解答

/***
Title:  Lesson2 2-1
Date:   2019/12/05
Author: Kotoka
***/
#include <iostream>
using namespace std;

int main(){
    int n = 0;
    int m = 0;
    cin >> n;
    int a[100] = {0};
    for (int i = 0; i < n; i++){
        cin >> a[i];
    }
    for (int i = 0; i < n; i++){
        if (a[i] == i){
            cout << i << endl;
            break;
        }
        else
            m++;
    }
    if (m == n)
        cout << "N" << endl;
    return 0;
}

2 . 四大湖

注意:总时间限制;1000ms 内存限制;65536kB

  描述

      我国有4大淡水湖。
      A说:洞庭湖最大,洪泽湖最小,鄱阳湖第三。
      B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三。
      C说:洪泽湖最小,洞庭湖第三。
      D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
      已知这4个湖的大小均不相等,4个人每人仅答对一个,
      请编程按照鄱阳湖、洞庭湖、太湖、洪泽湖的顺序给出他们的大小排名。

  输入

      无。

  输出

      输出为4行,第1行为鄱阳湖的大小名次,从大到小名次分别表示为1、2、3、4;第2、3、4行分别为洞庭湖、太湖、洪泽湖的大小名次。

  解答

/***
Title:  Lesson2 2-2
Date:   2019/12/05
Author: Kotoka
***/
#include<iostream>
using namespace std;

int main()
{
    int d,h,p,t,a[4];
    for(d=1; d<=4; d++) {
        for(h=1; h<=4; h++) {
              for(p=1; p<=4; p++) {
                for(t=1; t<=4; t++) {
                    if((d!=h&&d!=p&&d!=t&&h!=p&&h!=t&&p!=t)
                          &&((p==3)+(d==1)+(h==4)==1)
                          &&((p==2)+(d==4)+(t==3)+(h==1)==1)
                          &&((d==3)+(h==4)==1)
                          &&((p==1)+(d==3)+(t==4)+(h==2)==1)
                          &&((d+h+p+t)==10)) {
                        cout << p << endl << d << endl << t << endl << h << endl;
                        return 0;
                    }
                }
            }
        }
    }
    return 0;
}

3 . 发票统计

注意:总时间限制;1000ms 内存限制;65536kB

  描述

      有一个小型的报账系统,它有如下功能:
      (1)统计每个人所报发票的总钱数
      (2)统计每类发票的总钱数
      将此系统简化为如下:假设发票类别共有A、B、C三种;一共有三个人,ID分别为1、2、3。

  输入

      系统输入包含三行,每行第一个数为人员ID(整型,1或2或3),第二个数为发票总张数(张数不超过100),之后是多个发票类别(字符型,A或B或C)和相应发票金额(单进度浮点型,不超过1000.0)。

  输出

      输出包含六行,前三行为每人(按ID由小到大输出)所报发票总钱数(保留两位小数),后三行为每类发票的总钱数(保留两位小数)。

  样例输入

1 5 A 1.0 A 2.0 C 1.0 B 1.0 C 1
3 3 B 1 C 2 C 1
2 4 B 1 A 1 C 1 A 1


  样例输出

1 6.00
2 4.00
3 4.00
A 5.00
B 3.00
C 6.00


  解答

/***
Title:  Lesson2 2-3
Date:   2019/12/06
Author: Kotoka
***/
#include <iostream>
#include <iomanip>
using namespace std;

int main(){
    float a[6] = {0};
    for (int i = 0; i < 3; i++){
        int id;
        cin >> id;
        int num;
        cin >> num;
        for (int j = 0; j < num; j++){
            char category;
            cin >> category;
            float amount;
            cin >> amount;
            if (category == 'A'){
                a[id - 1] += amount;
                a[3] += amount;
            }
            if (category == 'B'){
                a[id - 1] += amount;
                a[4] += amount;
            }
            if (category == 'C'){
                a[id - 1] += amount;
                a[5] += amount;
            }
        }
    }

    cout << "1 " << fixed << setprecision(2) << a[0] << endl;
    cout << "2 " << fixed << setprecision(2) << a[1] << endl;
    cout << "3 " << fixed << setprecision(2) << a[2] << endl;
    cout << "A " << fixed << setprecision(2) << a[3] << endl;
    cout << "B " << fixed << setprecision(2) << a[4] << endl;
    cout << "C " << fixed << setprecision(2) << a[5] << endl;
    return 0;
    }

4 . Tomorrow never knows?

来源:POJ ( Coursera 声明:在 POJ 上完成的习题将不会计入 Coursera 的最后成绩。)
注意:总时间限制;1000ms 内存限制;65536kB

  描述

      甲壳虫的《A day in the life》和《Tomorrow never knows》脍炙人口,如果告诉你a day in the life,真的会是tomorrow never knows?相信学了计概之后这个不会是难题,现在就来实现吧。
      读入一个格式为yyyy-mm-dd的日期(即年-月-日),输出这个日期下一天的日期。可以假定输入的日期不早于1600-01-01,也不晚于2999-12-30。

  输入

      输入仅一行,格式为yyyy-mm-dd的日期。

  输出

      输出也仅一行,格式为yyyy-mm-dd的日期

  样例输入

2010-07-05


  样例输出

2010-07-06


  提示

      闰年的标准:
            (1)普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)
            (2)世纪年能被400整除的是闰年。(如2000年是闰年,1100年不是闰年)
      可以利用一个字符变量吃掉输入的短横线(减号),输出时请活用setfill和setw 控制符。

  解答

/***
Title:  Lesson2 2-4
Date:   2019/12/09
Author: Kotoka
***/
#include <iostream>
#include <iomanip>
using namespace std;

int isLeap(int y){
    if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
        return 1;
    else
        return 0;
}

int main(){
    int y, m, d;
    char ch;
    int ord[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int leap[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    cin >> y >> ch >> m >> ch >> d;
    if (m == 12 && d == 31)
        cout << y+1 << "-01-01" << endl;
    else if (isLeap(y)){
        if (d == leap[m])
            cout << y << '-' << setfill('0') << setw(2) << m + 1 << "-01" << endl;
        else
            cout << y << '-' << setfill('0') << setw(2) << m << '-' << setfill('0') << setw(2) << d + 1 << endl;
    }
    else{
        if (d == ord[m])
            cout << y << '-' << setfill('0') << setw(2) << m + 1 << "-01" << endl;
        else
            cout << y << '-' << setfill('0') << setw(2) << m << '-' << setfill('0') << setw(2) << d + 1 << endl;
    }
    return 0;
}

5 . 细菌实验分组

注意:总时间限制;1000ms 内存限制;65536kB

  描述

      有一种细菌分为A、B两个亚种,它们的外在特征几乎完全相同,仅仅在繁殖能力上有显著差别,A亚种繁殖能力非常强,B亚种的繁殖能力很弱。在一次为时一个小时的细菌繁殖实验中,实验员由于疏忽把细菌培养皿搞乱了,请你编写一个程序,根据实验结果,把两个亚种的培养皿重新分成两组。

  输入

      输入有多行,第一行为整数n(n≤100),表示有n个培养皿。
      其余n行,每行有三个整数,分别代表培养皿编号,试验前细菌数量,试验后细菌数量。

  输出

      输出有多行:
      第一行输出A亚种培养皿的数量,其后每行输出A亚种培养皿的编号,按繁殖率升序排列。
      然后一行输出B亚种培养皿的数量,其后每行输出B亚种培养皿的编号,也按繁殖率升序排列。

  样例输入

5
1 10 3456
2 10 5644
3 10 4566
4 20 234
5 20 232


  样例输出

3
1
3
2
2
5
4


  提示

      亚种内部细菌繁殖能力差异 远远小于 亚种之间细菌繁殖能力差异。
      也就是说,亚种间任何两组细菌的繁殖率之差都比亚种内部两组细菌的繁殖率之差大。

  解答

/***
Title:  Lesson2 2-5
Date:   2019/12/10
Author: Kotoka
***/
#include <iostream>
using namespace std;

int main(){
    int n, id[100];
    double pre[100], after[100], rate[100];
    cin >> n;
    for (int i = 0; i < n; i++){
        cin >> id[i] >> pre[i] >> after[i];
        rate[i] = after[i]/pre[i];
    }

    double temp1 = 0;
    int temp2=0;
    for(int i=0;i<n;i++){
        for (int j = 0; j < n - 1 - i; j++){
            if (rate[j + 1] > rate[j]){
                temp1 = rate[j];
                rate[j] = rate[j + 1];
                rate[j + 1] = temp1;
                temp2 = id[j];
                id[j] = id[j + 1];
                id[j + 1] = temp2;
            }
        }
    }

    double max = 0;
    int maxid = 0;
    int num = 0;
    for (int i = 0; i < n-1; i++){
        if ((rate[i] - rate[i + 1]) > max){
            max = rate[i] - rate[i + 1];
            maxid = id[i];
            num = i;
        }
    }

    cout << num + 1 << endl;
    for (int i = num; i >= 0; i--){
        cout << id[i] << endl;
    }
    cout << (n - num - 1 )<< endl;
    for (int i = n-1; i >num; i--){
        cout << id[i] << endl;
    }

    return 0;
}

6 . 流感传染

注意:总时间限制;1000ms 内存限制;65536kB

  描述

      有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。

  输入

      第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
      接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
      接下来的一行是一个整数m,m不超过100.

  输出

      输出第m天,得流感的人数

  样例输入

5
....#
.#.@.
.#@..
#....
.....
4


  样例输出

16


  解答

/***
Title:  Lesson2 2-6
Date:   2019/12/10
Author: Kotoka
***/
#include <iostream>
using namespace std;

int main(){
    //输入
    char a[101][101];
    int n, m, sum = 0;
    cin >> n;
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            cin >> a[i][j];
        }
    }
    cin >> m;

    for (int day = 1; day <= m; day++){
        //把被标记者转化成感染者
        for (int i = 0; i < n; i++){
            for (int j = 0; j < n; j++){
                if (a[i][j] == '!'){
                    a[i][j] = '@';
                }
            }
        }
        //标记四周的未感染者
        for (int i = 0; i < n; i++){
            for (int j = 0; j < n; j++){
                if (a[i][j] == '@'){
                    if (i - 1 >= 0 && a[i-1][j] == '.'){
                        a[i-1][j] = '!';
                    }
                    if (i + 1 < n && a[i+1][j] == '.'){
                        a[i+1][j] = '!';
                    }
                    if (j - 1 >= 0 && a[i][j-1] == '.'){
                        a[i][j-1] = '!';
                    }
                    if (j + 1 < n && a[i][j+1] == '.'){
                        a[i][j+1] = '!';
                    }
                }
            }
        }
    }
    //统计总感染人数,输出
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            if (a[i][j] == '@')
                sum++;
        }
    }
    cout << sum << endl;

 return 0;
}

tag(s): C++
show comments · back · home
Edit with markdown