Noip2019暑期训练2

 

题目名称

骑士遍历

和谐俱乐部

农场派对

对称二叉树

存盘文件名

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的(n≤10)正方形区域,楚继光骑着战马从任一点A(x,y)开始,试图找出一条路径,使马不重复地走遍区域的每一个点。马走的规则是走“日”字,可向任意方向走。

【输入格式】

三个整数n,x, y。n代表棋盘大小,x,y代表A点坐标,棋盘坐标从(0,0开始)。

【输出格式】

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

【输入样例】

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 ≥ Bj,Ai ≥Aj并且Bi≤Bj,但是如果j会员的美丽和强壮都不如i会员,则i会员会忽视j会员的存在。而如果j会员的美丽和强壮都强于i会员的话,则i会员会非常尊敬j会员。

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

【输入格式】

第一行为整数N(2≤ N≤10000),代表N个会员。

剩下N行为每个会员的A值和B值。( 1≤ Ai,Bi ≤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

上一篇:for循环和shell数组小脚本案例


下一篇:D. Beautiful Array DP