好老师(湖南省第九届程序设计大赛原题)
来源:互联网 发布:医院网络系统 编辑:程序博客网 时间:2024/05/18 00:05
好老师
题目不解释,中国人都能看懂。
思路分析:
对所有的学生,首先分为两种:
<一>老师认识他,直接叫名字即可
<二>老师不认识他,由别的学生的名字和他与那个学生的相对位置关系来叫他
对于第一种学生,最好办了,直接输出名字就好了。
对于第二种学生,只能说,哎,老师都不认识你,真难为我。
分三种情况:
(1)只有1个老师叫得出名字的同学离他最近,他在那个同学的右边
(2)只有1个老师叫得出名字的同学离他最近,他在那个同学的左边
(3)有2个老师叫叫得出名字的同学离他最近(一样近啦),他在这两个同学的中间
哈哈!这样一分析,题目就不难了。想当年金戈铁马!!!可是写了好长【代码二】,经过n次错误提交才AC的,我的时间!!!其实,纯属想多了,,,没那么复杂啦!!
解题思路:【代码一】
(1)开3个数组:
student[n][x] n个学生的名字,名字最长有x个字符
lift[x] 第x个学生离他最近的老师叫得出名字的那个同学(第lift[x]个同学)的左边(不排除在他左边有一个离他一样近的,老师交的出名字的同学【中间】)
right[x] 第x个学生离他最近的老师叫得出名字的那个同学(第right[x]个同学)的右边(说明同上)
(2)初始化所有数据:
首先就是对输入的的数据,直接初始化student[][]数组、n、q,然后,把lift[]和right[]数组初始化为-1,表示,不是最近
(3)处理数据:
就是处理lift[]和right[]数组,根据能否叫出,名字和距离来确定【咱还是看代码吧!这里不好解释啊】
(4)回答问题:
对于题目给出的人的序号,输出老师该叫的方式,根据数据处理步骤得出的数据。
老师叫得出名字的,直接输出名字
老师叫不出名字的,要是lift[x]和right[x]都不为-1,那么,这个人在中间
否则,值不是-1的数组的情况输出
【代码一】
#include<stdio.h>#include<string.h>int n,q; //the number of the studentschar student[110][4]; //the name of each studentsint right[110],lift[110];//the status of the student ,if it's no infromation it's initial by -1void initial()//to initials the infromations by the input{ scanf("%d%d",&n); for(int i=0;i<n;i++) scanf("%s",student[i]); scanf("%d",&q); memset(right,-1,sizeof(right)); // memset(middle,-1,sizeof(middle)); memset(lift,-1,sizeof(lift));}void deal()//to deal with the questions the program will ask{ int i,j; for(i=0;i<n;i++) { if(student[i][0]=='?') { for(j=0;;j++)//the distence of the nearst student { if((i-j>=0&&student[i-j][0]!='?')&&(i+j<=n-1&&student[i+j][0]!='?')) {//in the middle of two student right[i]=i-j; lift[i]=i+j; break; } else if(i-j>=0&&student[i-j][0]!='?') {//in the right of student i-j right[i]=i-j; break; } else if(i+j<=n-1&&student[i+j][0]!='?') {//in the lift of student i+j lift[i]=i+j; break; } } } }}void answer()//to answer the qustion by the infromations{ int x,i; scanf("%d",&x); x--; if(student[x][0]!='?')printf("%s\n",student[x]); else if(right[x]!=-1&&lift[x]!=-1) printf("middle of %s and %s\n",student[right[x]],student[lift[x]]); else if(right[x]!=-1) { for(i=x-right[x];i>0;i--)printf("right of "); printf("%s\n",student[right[x]]); } else { for(i=lift[x]-x;i>0;i--)printf("left of "); printf("%s\n",student[lift[x]]); }}int main()//it just the inter space{ initial(); deal(); while(q--) answer(); return 0;}
【代码二】
#include<stdio.h> #include<string.h> int n,q; //the number of the students char student[110][4]; //the name of every students int right[110],lift[110];//the status of the student ,if it's no infromation it's initial by -1 void initial()//to initials the infromations by the input { scanf("%d%d",&n); for(int i=0;i<n;i++) scanf("%s",student[i]); scanf("%d",&q); memset(right,-1,sizeof(right)); // memset(middle,-1,sizeof(middle)); memset(lift,-1,sizeof(lift)); } void deal()//to deal with the questions the program will ask { int r=0,l=n-1;//for the border students int i,j; //for the liftist students while(student[r][0]=='?')r++; for(j=0;j<r;j++)lift[j]=r; //for the rightist students while(student[l][0]=='?')l--; for(j=n-1;j>l;j--)right[j]=l; //for the inside student for(i=r+1;i<l;i++) { if(student[i][0]=='?') { for(j=0;;j++)//the distence of the nearst student { if((i-j>=0&&student[i-j][0]!='?')&&(i+j<=n-1&&student[i+j][0]!='?')) {//in the middle of two student right[i]=i-j; lift[i]=i+j; break; } else if(i-j>=0&&student[i-j][0]!='?') {//in the right of student i-j right[i]=i-j; break; } else if(i+j<=n-1&&student[i+j][0]!='?') {//in the lift of student i+j lift[i]=i+j; break; } } } } } void answer()//to answer the qustion by the infromations { int x,i; scanf("%d",&x); x--; if(student[x][0]!='?')printf("%s\n",student[x]); else if(right[x]!=-1&&lift[x]!=-1) printf("middle of %s and %s\n",student[right[x]],student[lift[x]]); else if(right[x]!=-1) { for(i=x-right[x];i>0;i--)printf("right of "); printf("%s\n",student[right[x]]); } else { for(i=lift[x]-x;i>0;i--)printf("left of "); printf("%s\n",student[lift[x]]); } } int main()//it just the inter space { initial(); deal(); while(q--) answer(); return 0; } /************************************************************** Problem: 1334 User: 20114045007 Language: C Result: Accepted Time:0 ms Memory:964 kb ****************************************************************/
- 好老师(湖南省第九届程序设计大赛原题)
- 第九届湖南省ACM—ICPC程序设计大赛 好老师
- 好老师 (湖南省第九届大学生计算机程序设计竞赛)
- 一行盒子 (湖南省第九届大学生程序设计大赛原题)
- 2013年湖南省第九届程序设计大大赛 G 好老师
- 湖南省第九届大学生计算机程序设计竞赛 好老师
- CSU 1334: 好老师(数学啊 湖南省第九届大学生计算机程序设计竞赛)
- 第九届湖南省大学生程序设计大赛
- 湖南省第九届程序设计大赛:字符识别?
- 【非技术贴】记湖南省第九届程序设计大赛
- 湖南省第九届程序设计大赛 搞笑版费马大定理
- 湖南省第六届大学生程序设计大赛原题 F Biggest Number (UVA1182)
- 湖南省第八届大学生程序设计大赛原题 D - 平方根大搜索 UVA 12505 - Searching in sqrt(n)
- 2013年湖南省第九届程序设计大赛 H 高桥和低桥 (线段树+二分)
- 第九届湖南省ACM—ICPC程序设计大赛 搞笑版费马大定理
- 第九届湖南省ACM—ICPC程序设计大赛 搞笑版费马大定理
- 2013年湖南省第九届程序设计大赛 F Funny Car Racing(最短路)
- 2013年湖南省第九届程序设计大赛 J 搞笑版费马大定理
- Linux指令学习
- .h与.hpp
- 动态生成table并实现分页效果
- Hadoop完全分布式模式的安装和配置
- jsp 乱码问题原因
- 好老师(湖南省第九届程序设计大赛原题)
- 微软面试题:在排序数组中,找出给定数字的出现次数
- 关于QObject::connect中函数参数
- 在Delphi7中调试COM+
- Selenium Grid使用与探索
- 关于native卡、java卡、GP规范
- 托管和非托管资源概念
- 【菜鸟入门】stm32 之 DMA
- 使用Beaglebone Black的SPI