您的位置:首页 > 理论基础

第四届CCF计算机职业资格认证考试题解(C++)

2015-12-11 13:38 543 查看

试题名称: 图像旋转

试题编号: 201503-1

时间限制: 5.0s

内存限制: 256.0MB

问题描述

  旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。

  计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。

输入格式

  输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。

  接下来n行每行包含m个整数,表示输入的图像。

输出格式

  输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。

样例输入

2 3

1 5 3

3 2 4

样例输出

3 4

5 2

1 3

评测用例规模与约定

  1 ≤ n, m ≤ 1,000,矩阵中的数都是不超过1000的非负整数。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int a[1010][1010];

int main()
{
int n, m;
while(scanf("%d %d", &n, &m)!=EOF){
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
scanf("%d", &a[i][j]);

for(int i = m-1; i >= 0; i--){
for(int j = 0; j < n-1; j++){
printf("%d ", a[j][i]);
}
printf("%d\n", a[n-1][i]);
}
}
return 0;
}



试题名称: 数字排序

**试题编号: 201503-2

**时间限制: 1.0s

**内存限制: 256.0MB

问题描述

  给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。

输入格式

  输入的第一行包含一个整数n,表示给定数字的个数。

  第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。

输出格式

  输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。

样例输入

12
5 2 3 3 1 3 4 2 5 2 3 5


样例输出

3 4
2 3
5 3
1 1
4 1


评测用例规模与约定

  1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。

#include<cstdio>
#include<stdlib.h>
#include<cstring>
#include<algorithm>
using namespace std;

struct node{
int num;
int c;
}a[1010];

bool cmp(node a, node b){
if(a.c == b.c)
return a.num < b.num;
return a.c > b.c;
}

int main()
{
int n, m;
while(scanf("%d", &n)!=EOF){
for(int i = 0; i < 1010; i++){
a[i].num = i;
a[i].c = 0;
}

for(int i = 0; i < n; i++){
scanf("%d", &m);
a[m].c++;
}

sort(a, a+1010, cmp);

for(int i = 0; i < 1010; i++){
if(0 == a[i].c)
break;
printf("%d %d\n", a[i].num, a[i].c);
}
}
return 0;
}



试题名称: 节日

试题编号: 201503-3

时间限制: 1.0s

内存限制: 256.0MB

问题描述

  有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日。

  现在,给你a,b,c和y1, y2(1850 ≤ y1, y2 ≤ 2050),希望你输出从公元y1年到公元y2年间的每年的a月的第b个星期c的日期。

  提示:关于闰年的规则:年份是400的整数倍时是闰年,否则年份是4的倍数并且不是100的倍数时是闰年,其他年份都不是闰年。例如1900年就不是闰年,而2000年是闰年。

  为了方便你推算,已知1850年1月1日是星期二。

输入格式

  输入包含恰好一行,有五个整数a, b, c, y1, y2。其中c=1, 2, ……, 6, 7分别表示星期一、二、……、六、日。

输出格式

  对于y1和y2之间的每一个年份,包括y1和y2,按照年份从小到大的顺序输出一行。

  如果该年的a月第b个星期c确实存在,则以”yyyy/mm/dd”的格式输出,即输出四位数的年份,两位数的月份,两位数的日期,中间用斜杠“/”分隔,位数不足时前补零。

  如果该年的a月第b个星期c并不存在,则输出”none”(不包含双引号)。

样例输入

5 2 7 2014 2015

样例输出

2014/05/11

2015/05/10

评测用例规模与约定

  所有评测用例都满足:1 ≤ a ≤ 12,1 ≤ b ≤ 5,1 ≤ c ≤ 7,1850 ≤ y1, y2 ≤ 2050。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool runnian(int year){
if((year%400 == 0) || (year%4 ==0 && year%100!=0))
return true;
return false;
}

int week[3005][13];   //µÚiÄêµÚjÔµĵÚÒ»ÌìΪÖܼ¸

void init(){
week[1850][1] = 2;
for(int i = 1851; i <= 2055; i++){          //¼ÆËãÿÄêµÚÒ»ÌìΪÖܼ¸
if(runnian(i-1)){
week[i][1] = (week[i-1][1] + 366 - 1)%7 + 1;   //ÒòΪÖÜÈÕ%7==0£¬±ÜÃâÕâÒ»µã
}
else{
week[i][1] = (week[i-1][1] + 365 - 1)%7 + 1;
}
}

for(int i = 1850; i <= 2055; i++){         //¼ÆËãµÚiÄêµÚjÔÂΪÖܼ¸
int flag = 0;
if(runnian(i))  flag = 1;
for(int j = 2; j < 13; j++){
if(j==3)
week[i][j] = (week[i][j-1] + month[j-1] + flag - 1)%7 + 1;
else
week[i][j] = (week[i][j-1] + month[j-1] - 1)%7 + 1;
}

}
}

int main()
{
init();
int a, b, c, y1, y2;
while(scanf("%d %d %d %d %d", &a, &b, &c, &y1, &y2)!=EOF){
int day, flag = 0;
for(int i = y1; i <= y2; i++){
int d;
if(week[i][a] > c)
d = 7 - (week[i][a] - c);
else
d = c - week[i][a];

day = (b-1)*7 + d + 1;

if(runnian(i))
month[2] = 29;
else
month[2] = 28;

if(day > month[a])
printf("none\n");
else{
printf("%04d/%02d/%02d\n", i, a, day);
}

}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: