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的(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

转载于:https://www.cnblogs.com/ljy-endl/p/11285923.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值