CSP-201503

问题描述

试题编号: 201503-1
试题名称: 图像旋转
时间限制: 5.0s
内存限制: 256.0MB
问题描述:
问题描述
  旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。
  计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。
输入格式
  输入的第一行包含两个整数nm,分别表示图像矩阵的行数和列数。
  接下来n行每行包含m个整数,表示输入的图像。
输出格式
  输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。
样例输入
2 3
1 5 3
3 2 4
样例输出
3 4
5 2
1 3
评测用例规模与约定
  1 ≤ n≤ 1,000,矩阵中的数都是不超过1000的非负整数。

模拟。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define pfi pair<float,int>
 4 int n,m,a[1010][1010];
 5 int main(){
 6     scanf("%d%d",&n,&m);
 7     for(int i=1;i<=n;++i)
 8         for(int j=1;j<=m;++j)scanf("%d",&a[i][j]);
 9     for(int i=m;i>=1;--i){
10         for(int j=1;j<=n;++j){
11             printf("%d%c",a[j][i],j==n?'\n':' ');
12         }
13     }
14     return 0;
15 }
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的非负整数。

水题。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct factor{
 4     int num,times;
 5     bool operator<(const factor& chs)const{
 6         if(times==chs.times) return num<chs.num;
 7         return times>chs.times;
 8     }
 9 }p;
10 vector<factor>vf;
11 int n,a,tot[1010];
12 int main(){
13     cin>>n;
14     while(n--){
15         cin>>a;
16         tot[a]++;
17     }
18     for(int i=0;i<=1000;++i){
19         if(tot[i]){
20             p.num=i;
21             p.times=tot[i];
22             vf.push_back(p);
23         }
24     }sort(vf.begin(),vf.end());
25     for(vector<factor>::iterator it = vf.begin();it!=vf.end();it++)cout<<it->num<<' '<<it->times<<endl;
26     return 0;
27 }
View Code

 

 

问题描述

试题编号: 201503-3
试题名称: 节日
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日。
  现在,给你abcy1y2(1850 ≤ y1y2 ≤ 2050),希望你输出从公元y1年到公元y2年间的每年的a月的第b个星期c的日期。
  提示:关于闰年的规则:年份是400的整数倍时是闰年,否则年份是4的倍数并且不是100的倍数时是闰年,其他年份都不是闰年。例如1900年就不是闰年,而2000年是闰年。
  为了方便你推算,已知1850年1月1日是星期二。
输入格式
  输入包含恰好一行,有五个整数abcy1y2。其中c=1, 2, ……, 6, 7分别表示星期一、二、……、六、日。
输出格式
  对于y1y2之间的每一个年份,包括y1y2,按照年份从小到大的顺序输出一行。
  如果该年的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 ≤ y1y2 ≤ 2050。

算出来i年a月1日是周几,然后推算出目标日期对应的号数看是否超过了当前年月份得最大天数即可。注意闰年二月特判。

遇到了一个很有趣得bug,我把isr(i)写作了isr[i]但是编译通过了。。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a,b,c,y1,y2;
 4 int d[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
 5 
 6 struct MyDate
 7 {
 8 int year;
 9 int month;
10 int day;
11 };
12 bool isr(int r){return r%4==0 && r%100!=0 || r%400==0;}
13 int GetAbsDays(MyDate x)
14 {
15 int i;
16 int month_day[] = {31,28,31,30,31,30,31,31,30,31,30,31};
17 int year = x.year-1;
18 int days = year * 365 + year/4 - year/100 + year/400;
19 if(isr(x.year)) month_day[1]++;
20 for(i=0; i<x.month-1; i++)
21 days += month_day[i];
22 days += x.day-1;
23 return days;
24 }
25 
26 
27 int main(){
28     cin>>a>>b>>c>>y1>>y2;c%=7;
29     for(int i=y1;i<=y2;++i){
30         if(isr(i))d[2]++;
31         int wek=(GetAbsDays(MyDate{i,a,1})+1)%7,cur=1;
32         while(wek!=c){
33             cur++;
34             wek=(wek+1)%7;
35         }
36         cur=cur+(b-1)*7;
37         if(cur<=d[a]){
38             printf("%d/%02d/%02d\n",i,a,cur);
39         }else cout<<"none"<<endl;
40         if(isr(i))d[2]--;
41     }
42     return 0;
43 }
View Code

 

 

问题描述

试题编号: 201503-4
试题名称: 网络延时
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机、交换机与电脑之间使用网络连接。交换机按层级设置,编号为1的交换机为根交换机,层级为1。其他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加1。所有的终端电脑都直接连接到交换机上。
  当信息在电脑、交换机之间传递时,每一步只能通过自己传递到自己所连接的另一台电脑或交换机。请问,电脑与电脑之间传递消息、或者电脑与交换机之间传递消息、或者交换机与交换机之间传递消息最多需要多少步。
输入格式
  输入的第一行包含两个整数nm,分别表示交换机的台数和终端电脑的台数。
  第二行包含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 ≤ 10000,1 ≤ m ≤ 10000。

裸题,求树的直径,把电脑以及交换机都视作节点即可。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=20020;
 4 int n,m,pn,pw=0;
 5 vector<int>g[maxn];
 6 int dis[20020];
 7 void dfs(int u,int fa){
 8     dis[u]=dis[fa]+1;
 9     if(dis[u]>pw){pw=dis[u];pn=u;}
10     for(int i=0;i<g[u].size();++i){
11         int v=g[u][i];
12         if(v==fa)continue;
13         dfs(v,u);
14     }
15 }
16 int main(){
17     int u;
18     cin>>n>>m;
19     for(int i=2;i<=n;++i){
20         cin>>u;
21         g[i].push_back(u);
22         g[u].push_back(i);
23     }
24     for(int i=n+1;i<=n+m;++i){
25         cin>>u;
26         g[i].push_back(u);
27         g[u].push_back(i);
28     }
29     dis[0]=-1;
30     dfs(1,0);
31     memset(dis,0,sizeof(dis));
32     dis[0]=-1;
33     dfs(pn,0);
34     cout<<pw<<endl;
35     return 0;
36 }
View Code

 

 

--

posted @ 2020-01-04 17:40  *zzq  阅读(202)  评论(0编辑  收藏  举报