编程题#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”。
#include<iostream>
using namespace std;
int main() {
int n,str[100];
int flag = 0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> str[i];
}
for (int j = 0; j < n; j++) {
if (str[j] == j) {
cout << str[j] << endl;
flag = 1;
break;
}
}
if (flag == 0) {
cout << "N" << endl;
}
return 0;
}
编程题#2:四大湖
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
我国有4大淡水湖。
A说:洞庭湖最大,洪泽湖最小,鄱阳湖第三。
B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三。
C说:洪泽湖最小,洞庭湖第三。
D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
已知这4个湖的大小均不相等,4个人每人仅答对一个,
请编程按照鄱阳湖、洞庭湖、太湖、洪泽湖的顺序给出他们的大小排名。
输入
无。
输出
输出为4行,第1行为鄱阳湖的大小名次,从大到小名次分别表示为1、2、3、4;第2、3、4行分别为洞庭湖、太湖、洪泽湖的大小名次。
#include<iostream>
using namespace std;
int main() {
int a, b, c, d;//分别是鄱阳湖、洞庭湖、太湖和洪泽湖
a = b = c = d = 0;
for (int a = 1; a <= 4; a++) //鄱阳湖可能的排名
{
for (int b = 1; b <= 4; b++) //洞庭湖可能的排名
{
for (int c = 1; c <= 4; c++) //太湖可能的排名
{
for (int d = 1; d <= 4; d++) //洪泽湖可能的排名
{
//条件1:4个湖的大小均不相等
if ((a != b && a != c && a != d && b != c && b != d && c != d)
//条件2:4个人每人仅答对一个
&& ((b == 1) + (d == 4) + (a == 3) == 1)
&& ((d == 1) + (b == 4) + (a == 2) + (c == 3) == 1)
&& ((d == 4) + (b == 3) == 1)
&& ((a == 1) + (c == 4) + (d == 2) + (b == 3) == 1)
)
{
cout << a << endl << b << endl << c << endl << d << endl;
}
}
}
}
}
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由小到大输出)所报发票总钱数(保留两位小数),后三行为每类发票的总钱数(保留两位小数)。
#include<iostream>
#include <iomanip>
using namespace std;
int main() {
int ID;
int n;
float ReceiptType[3] = { 0 };
float PersonTotal[3] = {0};
for (int j = 0; j < 3; j++) {
cin >> ID >> n;
char index = '\0';
float value = 0;
for (int i = 0; i < n; i++) {
cin >> index >> value;
PersonTotal[ID-1] += value;
if (index == 'A') {
ReceiptType[0] += value;
}
if (index == 'B') {
ReceiptType[1] += value;
}
if (index == 'C') {
ReceiptType[2] += value;
}
}
}
for (int i = 0; i < 3; i++) //输出每人的发票的钱数
{
cout << i + 1 << ' ' <<fixed << setprecision(2) << PersonTotal[i] << endl;
}
for (int i = 0; i < 3; i++) //输出每类发票的钱数
{
char type = '\0';
if (i == 0) type = 'A';
if (i == 1) type = 'B';
if (i == 2) type = 'C';
cout << type << ' ' << fixed<<setprecision(2) << ReceiptType[i] << endl; //注意这是cout输出保留两位小数的方法.
}
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的日期
提示
闰年的标准:
(1)普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)
(2)世纪年能被400整除的是闰年。(如2000年是闰年,1100年不是闰年)
可以利用一个字符变量吃掉输入的短横线(减号),输出时请活用setfill和setw 控制符。
#include<iostream>
#include <iomanip>
#include<stdio.h>
using namespace std;
bool leap_year(int a) {
if (a % 4 == 0 && a % 100 != 0) {
return true;
}
else if (a % 400 == 0) {
return true;
}
else {
return false;
}
}
int main() {
int year,month,day;
int pmonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int rmonth[12] = {31,29,31,30,31,30,31,31,30,31,30,31 };
char slash;
cin >> year >> slash >> month >> slash >> day;
if (leap_year(year)) {
if (day == rmonth[month - 1]&&month!=12) {
month += 1;
day = 1;
}
else if (month == 12 && day == 31) {
year += 1;
month = 1;
day = 1;
}
else {
day += 1;
}
}
else {
if (day == pmonth[month - 1] && month != 12) {
month += 1;
day = 1;
}
else if (month == 12 && day == 31) {
year += 1;
month = 1;
day = 1;
}
else {
day += 1;
}
}
printf("%d-%02d-%02d\n", year, month, day);//用printf输出,格式更容易设置
//cout << year << setw(2) << setfill('-') << month << setw(2) << setfill('-') << day << endl;
return 0;
}
编程题#5:细菌实验分组
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
有一种细菌分为A、B两个亚种,它们的外在特征几乎完全相同,仅仅在繁殖能力上有显著差别,A亚种繁殖能力非常强,B亚种的繁殖能力很弱。在一次为时一个 小时的细菌繁殖实验中,实验员由于疏忽把细菌培养皿搞乱了,请你编写一个程序,根据实验结果,把两个亚种的培养皿重新分成两组。
输入
输入有多行,第一行为整数n(n≤100),表示有n个培养皿。
其余n行,每行有三个整数,分别代表培养皿编号,试验前细菌数量,试验后细菌数量。
输出
输出有多行:
第一行输出A亚种培养皿的数量,其后每行输出A亚种培养皿的编号,按繁殖率升序排列。
然后一行输出B亚种培养皿的数量,其后每行输出B亚种培养皿的编号,也按繁殖率升序排列。
提示
亚种内部细菌繁殖能力差异 远远小于 亚种之间细菌繁殖能力差异。
也就是说,亚种间任何两组细菌的繁殖率之差都比亚种内部两组细菌的繁殖率之差大。
#include <iostream>
using namespace std;
int main() {
int n; // n为细菌的数量
// id记录细菌的编号, rate记录细菌的繁殖率,第i个细菌对应id[i]和rate[i]
int id[100];
double rate[100];
cin >> n;
for (int i = 0; i < n; i++) {
int initial, final;
cin >> id[i] >> initial >> final;
rate[i] = (double)final / initial;
}
// 对整个细菌排序
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;
}
return 0;
}
编程题#6:流感传染
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
输入
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100.
输出
输出第m天,得流感的人数
参考答案:
#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 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;
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n = 0;
cin >> n;
vector<vector<char> > matrix(n, vector<char>(n));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> matrix[i][j];
}
}
int m = 0;
cin >> m;
vector<int> coordX;
vector<int> coordY;
for (int day = 1; day < m; day++)
{
//找出所有流感坐标
coordX.clear();
coordY.clear();
//找出所有流感坐标
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (matrix[i][j] == '@')
{
coordX.push_back(i);
coordY.push_back(j);
}
}
}
for (unsigned int k = 0; k < coordX.size(); k++)
{
int x = 0, y = 0;
x = coordX[k] - 1;
y = coordY[k];
if (x >= 0 && matrix[x][y] == '.')
{
matrix[x][y] = '@';
}
x = coordX[k];
y = coordY[k] - 1;
if (y >= 0 && matrix[x][y] == '.')
{
matrix[x][y] = '@';
}
x = coordX[k];
y = coordY[k] + 1;
if (y < n && matrix[x][y] == '.')
{
matrix[x][y] = '@';
}
x = coordX[k] + 1;
y = coordY[k];
if (x < n && matrix[x][y] == '.')
{
matrix[x][y] = '@';
}
}
}
int num = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (matrix[i][j] == '@')
{
num++;
}
}
}
cout << num << endl;
return 0;
}