首页 > 其他 > 详细

Noip2019暑期训练2

时间:2019-08-02 01:56:08      阅读:129      评论:0      收藏:0      [点我收藏+]

 

题目名称

骑士遍历

和谐俱乐部

农场派对

对称二叉树

存盘文件名

knight

Beautiful

party

tree

输入文件名

knight.in

Beautiful.in

party.in

tree.in

输出文件名

knight.out

Beautiful.out

party.out

tree.out

时限

1s

1s

1s

1s

内存限制

128MB

128MB

128MB

128MB

1:骑士遍历(knight)

【题目描述】

楚继光判断邪狼可能藏在一个n×n的(n10)正方形区域,楚继光骑着战马从任一点Axy)开始,试图找出一条路径,使马不重复地走遍区域的每一个点。马走的规则是走“日”字,可向任意方向走。

【输入格式】

三个整数nx, yn代表棋盘大小,xy代表A点坐标,棋盘坐标从(00开始)。

【输出格式】

棋盘路径(搜索方向从最下方开始,依次逆时钟旋转)。

【输入样例】

5 2 0

【输出样例】

23 4 13 8 21

12 7 22 3 14

17 24 5 20 9

6 11 18 15 2

25 16 1 10 19


 

这道题肥肠简单,深搜AC,我的代码如下: 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[11][11],n;
 4 bool b[11][11];
 5 int dx[8]={1,2,2,1,-1,-2,-2,-1};//搜索是从{1,-2}开始的
 6 int dy[8]={-2,-1,1,2,2,1,-1,-2};//这里题目表述不清,但是增量一定要这样写!不然输出和答案不一
 7 void search(int x,int y,int t)
 8 {
 9     if(t==n*n)
10     {
11         for(int j=n-1;j>=0;j--)
12         {
13             for(int i=0;i<n;i++)
14                 cout<<a[i][j]<< ;
15             cout<<endl;
16         }
17         exit(0);//讲解的时候老师说这里最好不要用强制退出,容易出错,再定义一个bool变量判断是否有路径就可以啦
18     }
19     for(int i=0;i<8;i++)
20     {
21         int p=x+dx[i],q=y+dy[i];
22         if(p>=0&&p<n&&q>=0&&q<n&&!(b[p][q]))
23         {
24             b[p][q]=true;
25             a[p][q]=t+1;
26             search(p,q,a[p][q]);
27             b[p][q]=false;
28         }
29     }
30     
31 }
32 int main()
33 {
34     //freopen("knight.in","r",stdin);(考试的时候一定记得这两行不要写错啦!!!)
35     //freopen("knight.out","w",stdout);(最好是一拿到题目就写,不怕一万就怕万一)
36     int x,y;cin>>n>>x>>y;
37     a[x][y]=1;b[x][y]=true;
38     search(x,y,1);
39     cout<<"-1";//本题数据有bug,会出现没有解决方案的情况,此时输出“-1”
40     return 0;
41 }

 

2和谐俱乐部(Beautiful

【题目描述】

“木秀于林,风必摧之;堆出于岸,流必湍之;行高于人,众必非之”,人类最可怕的罪之一,就是嫉妒。它生出许多最黑暗、污秽的罪行,使魔法世界的历史为之蒙羞。

魔法学院的某一个私人俱乐部有N个会员,每一个会员都是既美丽又强壮的,我们以A代表强壮,以B代表美丽。但他们都有一个缺点是嫉妒。例如i会员嫉妒j会员的条件是:Ai Aj并且Bi BjAi Aj并且BiBj,但是如果j会员的美丽和强壮都不如i会员,则i会员会忽视j会员的存在。而如果j会员的美丽和强壮都强于i会员的话,则i会员会非常尊敬j会员。

为了庆祝新年的到来,俱乐部经理准备组织一次舞会,但是他担心各会员之间由于嫉妒而引发争斗。所以,邀请哪些会员前来参加舞会实在是伤透了经理的脑筋。那么,精通电脑编程的你,能告诉经理发放邀请函最多人数是多少吗?

【输入格式】

第一行为整数N2N10000),代表N个会员。

剩下N行为每个会员的A值和B值。( 1AiBi 109 )

【输出格式】

一行为最大邀请人数。

【输入样例】

4

1 1

1 2

2 1

2 2

【输出样例】

2


 

这道题呢就是先排序,然后再求最长上升子序列(DP),没有一点技巧!只不过要仔细看题目:如果j会员的美丽和强壮 都 不如i会员,则i会员会忽视j会员的存在。而如果j会员的美丽和强壮 都 强于i会员的话,则i会员会非常尊敬j会员。我的修改后的代码(这道题一开始只得了部分分)如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,mi;
 4 struct node{
 5     int a,b,l;
 6     bool operator <(const node &y)const
 7     {
 8         return a<y.a;
 9     }
10 }x[10001];
11 int main()
12 {
13     //freopen("Beautiful.in","r",stdin);
14     //freopen("Beautiful.out","w",stdout);
15     cin>>n;
16     for(int i=1;i<=n;i++)
17     {
18         cin>>x[i].a>>x[i].b;
19         x[i].l=1;
20     }
21     sort(x+1,x+n+1);
22     for(int i=n-1;i>=1;i--)
23     {
24         mi=0;
25         for(int j=i+1;j<=n;j++)
26         {
27             if(x[i].b<x[j].b&&x[j].l>mi&&x[i].a<x[j].a)//一开始我没写x[i].a<x[j].a,因此错了两个点,所以说题目一定要看清楚!
28             {
29                 mi=x[j].l;
30             }
31         }
32         x[i].l=mi+1;
33     }
34     mi=x[1].l;
35     for(int i=1;i<=n;i++)
36         if(x[i].l>mi)mi=x[i].l;
37     cout<<mi;
38     return 0;
39 }

3:农场派对party)

此题详情和代码请见↓↓↓

农场派对(party)(信息学奥赛一本通 1497) - endl\n - 博客园  https://www.cnblogs.com/ljy-endl/p/11285884.html


 

4对称二叉树(tree)

 

此题详情和代码请见↓↓↓

【18NOIP普及组】对称二叉树(信息学奥赛一本通 1981)(洛谷 5018) - endl\n - 博客园  https://www.cnblogs.com/ljy-endl/p/11281818.html

Noip2019暑期训练2

原文:https://www.cnblogs.com/ljy-endl/p/11285923.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!