coursera-Peking University-c程序进阶-week2

编程题#1:寻找下标

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

已知一个整数数组x[],其中的元素彼此都不相同。找出给定的数组中是否有一个元素满足x[i]=i的关系,数组下标从0开始。

举例而言,如果x[]={-2,-1,7,3,0,8},则x[3] = 3,因此3就是答案。
输入

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

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

样例输出

编程题#2:四大湖

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

我国有4大淡水湖。

A说:洞庭湖最大,洪泽湖最小,鄱阳湖第三。

B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三。

C说:洪泽湖最小,洞庭湖第三。

D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。

已知这4个湖的大小均不相等,4个人每人仅答对一个,

请编程按照鄱阳湖、洞庭湖、太湖、洪泽湖的顺序给出他们的大小排名。

输入

无。
输出

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

样例输出

编程题#3:发票统计

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

有一个小型的报账系统,它有如下功能:

(1)统计每个人所报发票的总钱数

(2)统计每类发票的总钱数

将此系统简化为如下:假设发票类别共有A、B、C三种;一共有三个人,ID分别为1、2、3。
输入

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

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

样例输出

编程题#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的日期
样例输入

样例输出

提示

闰年的标准:

(1)普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)

(2)世纪年能被400整除的是闰年。(如2000年是闰年,1100年不是闰年)

可以利用一个字符变量吃掉输入的短横线(减号),输出时请活用setfill和setw 控制符。

编程题#5:细菌实验分组

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

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

输入有多行,第一行为整数n(n≤100),表示有n个培养皿。

其余n行,每行有三个整数,分别代表培养皿编号,试验前细菌数量,试验后细菌数量。
输出

输出有多行:

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

然后一行输出B亚种培养皿的数量,其后每行输出B亚种培养皿的编号,也按繁殖率升序排列。
样例输入

样例输出

提示

亚种内部细菌繁殖能力差异 远远小于 亚种之间细菌繁殖能力差异。

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

编程题#6:流感传染

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

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

第一行一个数字n,n不超过100,表示有n*n的宿舍房间。

接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。

接下来的一行是一个整数m,m不超过100.
输出

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

样例输入

样例输出


#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
using namespace std;
void p01(){
    int n;
    int sz[100];
    bool flag=0;
    cin>>n;
    for (int i=0; i<n; i++) {
        cin>>sz[i];
        if (sz[i]==i ) {
            cout<<sz[i]<<endl;
            flag=1;
            break;
        }
    }
    if (flag==0) {
        cout<<'N'<<endl;
    }
    return;
}
void p02(){
    for (int p = 1; p < 5; p++)
    {
        for (int d = 1; d < 5; d++)
        {
            if (d == p)
            {
                continue;
            }
            for (int t = 1; t < 5; t++)
            {
                if ((t==d)||(t==p))
                {
                    continue;
                }
                for (int h = 1; h < 5; h++)
                {
                    if ((h==t)||(h==p)||(h==d))
                    {
                        continue;
                    }
                    if (((d==1)+(h==4)+(p==3) == 1)&&((h==1)+(d==4)+(p==2)+(t==3) == 1)&&((h==4)+(d==3) == 1)&&((p==1)+(t==4)+(h==2)+(d==3) == 1))
                    {
                        cout << p << endl << d << endl << t << endl << h <<endl;
                    }
                }
            }
        }
    }
    return;
}
void p03(){
    double fp[3][3]={0};
    double idsum[3]={0};
    double kindsum[3]={0};
    int n=0;
    while (n<3) {
        int id,zfp;
        cin>>id>>zfp;
        for (int i=0; i<zfp; i++) {
            char kind;
            double prize;
            cin>>kind>>prize;
            if (kind=='A') {
                fp[id-1][0] +=prize;
            }else if (kind=='B'){
                fp[id-1][1] +=prize;
            }else if (kind=='C'){
                fp[id-1][2] +=prize;
            }
        }
        n++;
    }
    for (int i=0; i<3; i++) {
        for (int j=0; j<3; j++) {
            idsum[i]+=fp[i][j];
            kindsum[i]+=fp[j][i];
        }
    }

    for (int i=0; i<3; i++) {
        cout<<i+1<<' '<<fixed<<setprecision(2)<<idsum[i]<<endl;
    }
    for (int i=0; i<3; i++) {
        cout<<char(65+i)<<' '<<kindsum[i]<<endl;
    }
}
void p04(){
    int year,month,day,isLeapYear,dayOfMonth;
    int dayTable[2][13] = {

        {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},

        {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

    };
    scanf("%d-%d-%d",&year,&month,&day);

    if (year >=1600 && year<=2999 && month>=1 && month<=12 && day>=0 && day<=31) {
        isLeapYear = (year % 4 == 0 && year % 100 != 0)|| (year %400 == 0);
        dayOfMonth=dayTable[isLeapYear][month];
        day++;
        if (day>dayOfMonth) {
            day=1;
            ++month;
        }
        if (month>12) {
            month=1;
            year++;
        }
    }
    printf("%d-%02d-%02d\n", year, month, day);
}
void p05(){
    int n=0,id[101],cs,jg;
    double rate[101];
    cin>>n;
    int i=0;
    while (i<n) {

        cin>>id[i]>>cs>>jg;
        rate[i]=(double)jg/cs;
        i++;
    }
   // 对整个细菌排序
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (rate[j + 1] > rate[j]) {
                int tmpId = id[j];
                id[j] = id[j + 1];
                id[j + 1] = tmpId;
                double tmpRate = rate[j];
                rate[j] = rate[j + 1];
                rate[j + 1] = tmpRate;
            }
        }
    }

    // 记录最大的差
    double maxDiff = 0;
    // 和最大差的下标
    int maxDiffIndex = 0;
    for (int i = 0; i < n - 1; i++) {
        double diff = rate[i] - rate[i + 1];
        if (maxDiff < diff) {
            maxDiff = diff;
            maxDiffIndex = i;
        }
    }

    //输出繁殖率较大的那组细菌
    cout << maxDiffIndex + 1 << endl;
    for (int i = maxDiffIndex; i >= 0; i--) {
        cout << id[i] << endl;
    }

    //输出繁殖率较小的那组细菌
    cout << n - maxDiffIndex - 1 << endl;
    for (int i = n - 1; i >= maxDiffIndex + 1; i--) {
        cout << id[i] << endl;
    }
}
void p06(){

        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 d = 1; d <= m; d++)
        {
            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 <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]='!';
                        if(i - 1 >= 0 && a[i - 1][j] == '.')
                            a[i - 1][j] = '!';
                    }
                }
            }
            
        }
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
            {
                if(a[i][j] == '@')
                    sum++;
            }
        }
        cout << sum << endl;
  
}
int main() {
//    p01();
//    p02();
//    p03();
//    p04();
//    p05();
    p06();
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值