CCF考试真题题解

CCF考试认证:题解参考博客http://blog.csdn.net/u014578266/article/details/45221841

问题描述

试题编号:    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 <iostream>

#define max 1002

using namespace std;



int a[max][max];

int main()

{

    int m,n;

    while(cin>>n>>m){

        for(int i = 0;i < n;i++){

            for(int j = 0;j < m;j++){

                cin>>a[i][j];

            }

        }

        for(int j = m-1;j>=0;j--){

            for(int i = 0;i<n;i++){

                cout<<a[i][j]<<" ";

            }

            cout<<endl;

        }

    }

    return 0;

}
View Code
问题描述

试题编号:    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 <iostream>

#define max 1005

using namespace std;



struct a{

    int index;

    int count;

    a(){

        count = 1;

    }

}b[max],e;



//冒泡排序

void Sort(int y){

    for(int j = 1;j < y;j++){

    for(int i = 0;i < y-j;i++){

        if(b[i].count < b[i+1].count ||(b[i].count == b[i+1].count && b[i].index > b[i+1].index)){

            e.index = b[i].index;

            e.count = b[i].count;

            b[i].index = b[i+1].index;

            b[i].count = b[i+1].count;

            b[i+1].index = e.index;

            b[i+1].count = e.count;

        }

    }

}

}

int main()

{

    int n,c;

    while(cin>>n){

            int Index = 1;

            cin>>b[0].index;

        for(int i = 1;i < n;i++){

            cin>>c;

            bool zhang = true;

            for(int j = 0;zhang && j < Index;j++){

                if(c==b[j].index){

                    b[j].count++;

                    zhang = false;

                }

            }

            if(zhang){

                b[Index++].index = c;

            }

        }



        Sort(Index);

        for(int t = 0;t < Index;t++){

            cout<<b[t].index<<" "<<b[t].count<<endl;

        }

    }

    return 0;

}
View Code
问题描述

试题编号:    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 ≤ 121 ≤ b ≤ 51 ≤ c ≤ 71850 ≤ y1, y2 ≤ 2050

这道题是个死坑,搞了好久都不曾搞出来,被气的,伤心啊……

 

 

问题描述

试题编号:    201503-4

试题名称:    网络延时

时间限制:    1.0s

内存限制:    256.0MB

问题描述:    

问题描述

  给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机、交换机与电脑之间使用网络连接。交换机按层级设置,编号为1的交换机为根交换机,层级为1。其他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加1。所有的终端电脑都直接连接到交换机上。

  当信息在电脑、交换机之间传递时,每一步只能通过自己传递到自己所连接的另一台电脑或交换机。请问,电脑与电脑之间传递消息、或者电脑与交换机之间传递消息、或者交换机与交换机之间传递消息最多需要多少步。

输入格式

  输入的第一行包含两个整数n, m,分别表示交换机的台数和终端电脑的台数。

  第二行包含n - 1个整数,分别表示第2、3、……、n台交换机所连接的比自己上一层的交换机的编号。第i台交换机所连接的上一层的交换机编号一定比自己的编号小。

  第三行包含m个整数,分别表示第1、2、……、m台终端电脑所连接的交换机的编号。

输出格式

  输出一个整数,表示消息传递最多需要的步数。

样例输入

4 2

1 1 3

2 1

样例输出

4

样例说明

  样例的网络连接模式如下,其中圆圈表示交换机,方框表示电脑:



  其中电脑1与交换机4之间的消息传递花费的时间最长,为4个单位时间。

样例输入

4 4

1 2 2

3 4 4 4

样例输出

4

样例说明

  样例的网络连接模式如下:



  其中电脑1与电脑4之间的消息传递花费的时间最长,为4个单位时间。

评测用例规模与约定

  前30%的评测用例满足:n ≤ 5, m ≤ 5。

  前50%的评测用例满足:n ≤ 20, m ≤ 20。

  前70%的评测用例满足:n ≤ 100, m ≤ 100。

  所有评测用例都满足:1 ≤ n ≤ 100001 ≤ m ≤ 10000
问题描述

试题编号:    201503-5

试题名称:    最小花费

时间限制:    4.0s

内存限制:    256.0MB

问题描述:    

问题描述

  C国共有n个城市。有n-1条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达。小R来到C国旅行,他共规划了m条旅行的路线,第i条旅行路线的起点是si,终点是ti。在旅行过程中,小R每行走一单位长度的路需要吃一单位的食物。C国的食物只能在各个城市中买到,而且不同城市的食物价格可能不同。

  然而,小R不希望在旅行中为了购买较低价的粮食而绕远路,因此他总会选择最近的路走。现在,请你计算小R规划的每条旅行路线的最小花费是多少。

输入格式

  第一行包含2个整数n和m。

  第二行包含n个整数。第i个整数wi表示城市i的食物价格。

  接下来n-1行,每行包括3个整数u, v, e,表示城市u和城市v之间有一条长为e的双向道路。

  接下来m行,每行包含2个整数si和ti,分别表示一条旅行路线的起点和终点。

输出格式

  输出m行,分别代表每一条旅行方案的最小花费。

样例输入

6 4

1 7 3 2 5 6

1 2 4

1 3 5

2 4 1

3 5 2

3 6 1

2 5

4 6

6 4

5 6

样例输出

35

16

26

13

样例说明

  对于第一条路线,小R会经过2->1->3->5。其中在城市2处以7的价格购买4单位粮食,到城市1时全部吃完,并用1的价格购买7单位粮食,然后到达终点。

评测用例规模与约定

  前10%的评测用例满足:n, m ≤ 20, wi ≤ 20;

  前30%的评测用例满足:n, m ≤ 200;

  另有40%的评测用例满足:一个城市至多与其它两个城市相连。

  所有评测用例都满足:1 ≤ n, m ≤ 1051 ≤ wi ≤ 1061 ≤ e ≤ 10000

 

 

你可能感兴趣的:(题解)