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)