9512.net
甜梦文库
当前位置:首页 >> 数学 >>

讲评--表2



1002:特殊的数字
Problem Description
今天我们来找一下“特殊的数字”。这里“特殊的数字”的定义是该数字每一位上的数都是 互不相同的整数,而且该数字是没有前导零的非负整数。例如:13520 就是一个“特殊的数 字”,而 1314 就不是。 现在给你一个整数 N,你要做的工作就是算出比 N 小的“特殊的数字”共有多少个?

/>Input
输入多组测试数据,每组测试数据占一行,每行输入一个整数 N(0<N<=100000),总的测试 数据不会超过 300 个。

Output Time Limited Eceeded(考虑数组越界)
对于每组测试数据,输出比 N 小的“特殊的数字”的个数,每个输出占一行。

Sample Input
11 12 21 22

Sample Output
10 10 19 20

#include<iostream> using namespace std; int main() { int n,num,i,t,a[10],j,k,l,flag; while(cin>>n) { num=0;

for(i=1;i<n;i++) { t=i; flag=0; memset(a,0,sizeof(a)); while(t) //判断每个 t 是否为“特殊的数字” { j=t%10; if(a[j]==0) a[j]=1; else { } if(flag==0) num++; } cout<<num<<endl; } return 0; } flag=1;break; } t=t/10;

1008:单链表中删除重复值
Problem Description
设计算法实现在单链表中删去相同的多余结点,然后按从小到大输出,如若单链表中不存在 相同的结点,则直接从小到大输出单链表。

Input
输入数据有多组。每组数据包括 2 行,第一行表示单链表的长度 n(不会超过 100);第二行 表示单链表的所有元素。

Output
输出执行操作后的单链表。每个结果占一行。

Sample Input
5 1 3 7 3 9 5 1 3 5 7 9

Sample Output
1 3 7 9 1 3 5 7 9

#include<iostream> using namespace std; struct Node { int data; Node *next; }; class LinkList { public: LinkList(int a[ ], int n); void PrintList( ); void Delete();

void Sort(); private: Node *first; int len; }; LinkList::LinkList(int a[ ], int n) { first=new Node; Node *r,*s; r=first; for (int i=0; i<n; i++) { s=new Node; s->data=a[i]; r->next=s; r=s; } r->next=NULL; len=n; } void LinkList::PrintList( ) { Node *p; p=first->next; if(p) { cout<<p->data; p=p->next; while (p) { cout<<" "<<p->data; p=p->next; } cout<<endl; } } void LinkList::Delete() {

Node *p,*q; if(first->next) { p=first->next; q=p->next; while(q) { Node *t=first->next; while(t!=q) { if(t->data==q->data) break; else t=t->next; } if(t!=q)//有重复 { p->next=q->next; delete q; q=p->next; len--; } else { p=q; q=p->next; } } } } void LinkList::Sort() { int i,j,t; Node *p,*q; for(i=0;i<len-1;i++) {

p=first->next; q=p->next; for(j=0;j<len-i-1;j++) { if(p->data>q->data) { t=p->data; p->data=q->data; q->data=t; } p=q; q=p->next; } } } int main() { int a[100],i,n; while(cin>>n) { for(i=0;i<n;i++) cin>>a[i]; LinkList L(a,n); L.Delete(); L.Sort(); L.PrintList(); } return 0; }

1003:求相同后缀首字符
Problem Description
现用单链表保存字符串,假定有两个字符串存在相同的后缀,请输出该相同后缀的首字符。

Input
有多组数据,每组包含两个字符串。(串长小于 1600)

Output
输出该相同后缀的首字符。

Sample Input
loading being cat eat

Sample Output
i a

#include<iostream> #include<string> using namespace std; const int MAXSIZE=1600; struct Node { char data; Node *next; }; Node *creat(char a[ ], int n) { Node *first; Node *r,*s; first=new Node; //生成头结点 r=first; //尾指针初始化 for (int i=0; i<n; i++) { s=new Node; s->data=a[i]; //为每个数组元素建立一个结点 r->next=s; r=s; //插入到终端结点之后

} r->next=NULL; return first; }

//单链表建立完毕,将终端结点的指针域置空

void Search(Node *LA,int n,Node *LB,int m) { int i,j; Node *p,*q; p=LA->next;q=LB->next; i=0;j=n-m; while(p&&i<j) { p=p->next; i++; } while(p&&q) { if(p->data==q->data) break; else { p=p->next; q=q->next; } } if(p) cout<<p->data<<endl; } int main() { char a[MAXSIZE],b[MAXSIZE]; int n,m; Node *LA,*LB; while(cin>>a>>b) { n=strlen(a); m=strlen(b); if(n>=m) { LA=creat(a,n); LB=creat(b,m); Search(LA,n,LB,m); } else

{ LA=creat(b,m); LB=creat(a,n); Search(LA,m,LB,n); } } return 0; }

1003:单链表连续删除
Problem Description
设有非空单链表 A,现要求从单链表 A 中删除自第 i 个元素起的共 len 个元素。 注意:该题未用单链表完成的为 0 分!

Input9
输入数据有多组; 每组第一行为单链表 A 的元素个数 n(0<n<20); 每组第二行为单链表 A 的各个元素; 每组第三行为两个整数 i 和 len,注意 len 可为 0。

Output
对于每组数据,输出为一行,输出处理后单链表 A 中的各个元素,每两个元素之间有一空格, 每行最后均无空格。 若输入的 i 和 len 中有任一数不合法,则不做任何处理,只输出“data error”。

Sample Input
5 1 2 3 4 5 2 3

Sample Output
1 5

#include<iostream> using namespace std; struct Node { int data; Node *next; }; class LinkList { public: LinkList(int a[ ], int n); void PrintList( ); void Delete(int i,int len); private: Node *first;

}; LinkList::LinkList(int a[ ], int n) { first=new Node; Node *r,*s; r=first; for (int i=0; i<n; i++) { s=new Node; s->data=a[i]; r->next=s; r=s; } r->next=NULL; } void LinkList::PrintList( ) { Node *p; p=first->next; if(p) { cout<<p->data; p=p->next; while (p) { cout<<" "<<p->data; p=p->next; } cout<<endl; } } void LinkList::Delete(int i,int len) { int j; Node *p,*q,*t,*r; if(len>0) { p=first; j=0; while(j<i-1) { p=p->next; j++; } q=p; j=0; while(j<len)

{ q=q->next; j++; } t=p->next; p->next=q->next; while(t!=q) { r=t->next; delete t; t=r; } delete q; } } int main() { int a[100],i,n,len; while(cin>>n) { for(i=0;i<n;i++) cin>>a[i]; cin>>i>>len; if(len<0||i<1||i>n||i+len-1>n) cout<<"data error"<<endl; else { LinkList L(a,n); L.Delete(i,len); L.PrintList(); } } return 0; }

1003:Min 值
Problem Description
设有一非空单链表, 现要求将其数据域值最小的结点移到单链表的最前面 (假设最小值唯一) 。 要求:自单链表建立后,不得再申请额外的新结点。

Input
输入数据有多组,每组第一行为单链表的元素个数 n(0<n<100);第二行为单链表的各个元 素。

Output
对于每组数据,输出为一行,输出处理后单链表中的各个元素,每两个元素之间有一空格, 每行最后均无空格。

Sample Input
8 4 2 6 -3 1 9 14 5

Sample Output
-3 4 2 6 1 9 14 5

#include<iostream> using namespace std; struct Node { int data; Node *next; }; class LinkList { public: LinkList(int a[ ], int n); void PrintList( ); void Delete(); private: Node *first; }; LinkList::LinkList(int a[ ], int n) {

first=new Node; Node *r,*s; r=first; for (int i=0; i<n; i++) { s=new Node; s->data=a[i]; r->next=s; r=s; } r->next=NULL; } void LinkList::PrintList( ) { Node *p; p=first->next; if(p) { cout<<p->data; p=p->next; while (p) { cout<<" "<<p->data; p=p->next; } cout<<endl; } } void LinkList::Delete() { Node *q,*p,*t,*r; int min; p=first;t=p; q=first->next; min=q->data; while(q) { if(q->data<min) { min=q->data; t=p; } p=p->next; q=q->next; } if(t!=first) { r=t->next;

t->next=r->next; r->next=first->next; first->next=r; } } int main() { int a[100],i,n; while(cin>>n) { for(i=0;i<n;i++) cin>>a[i]; LinkList L(a,n); L.Delete(); L.PrintList(); } return 0; }

1002:跳水比赛
Problem Description
选手 n 名,假设比赛名次是由空中动作得分 x 和入水动作得分 y 来决定的。首先,空中动作 得分越高,名次越高。若空中动作得分相等,则根据入水动作得分来决定,入水动作得分越 高,名次越高。

Input
输入数据有多组,每组数据有三行: 第一行为选手数 n(0<n<=50),各选手编号分别为 1,2,3...n; 第二行为 n 个非负整数,分别代表 n 个选手的空中动作; 第三行为 n 个非负整数,分别代表 n 个选手的入水动作。

Output
按名次从高到低输出选手的编号; 每组数据的输出占一行; 每两个编号之间用逗号隔开。

Sample Input
5 2 2 2 3 3 5 4 6 1 2

Sample Output
5,4,3,1,2

#include<iostream> #include<string> using namespace std; const int MaxSize = 50; struct score { int num; int x; int y; }; int main() { int n,i,j,s,t; score a[MaxSize];

score temp; while(cin>>n) { for(i=0;i<n;i++) a[i].num=i+1; for(i=0;i<n;i++) cin>>a[i].x; for(i=0;i<n;i++) cin>>a[i].y; for(i=0;i<n-1;i++) for(j=0;j<n-i-1;j++) if(a[j].x<a[j+1].x) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } else if(a[j].x==a[j+1].x) { if(a[j].y<a[j+1].y) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } cout<<a[0].num; for(i=1;i<n;i++) cout<<','<<a[i].num; cout<<endl; } return 0; }

1001:判操作序列有效性
Problem Description
假设以 I 和 O 分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可 表示为仅由 I 和 O 组成的序列,称可以操作的序列为合法序列,否则成为非法序列。请编写 一个对该操作序列的有效性进行判断,若有效输出 1,无效输出 0。

Input
有多组数据,每组为由 I 和 O 组成的序列,序列长度不超过 50。

Output
操作序列有效输出 1,无效输出 0。

Sample Input
IOIIOIOO IOOIOIIO

Sample Output
1 0

#include <iostream> using namespace std; const int MAXSIZE=50; int Judge(char s[]) { int i=0,top=-1; while(s[i]!='\0') { if(s[i]=='I') top++; else { if(top==-1) return 0; else top--; } i++; } if(top==-1) return 1;

else return 0; } int main() { char a[MAXSIZE]; while(cin>>a) cout<<Judge(a)<<endl; return 0; }

1004:循环队列的操作
Problem Description
现有一长度为 n 的整数序列和一最大容量为 m 的循环队列(用长为 m+1 的一维数组实现), 要求将该序列中的偶数存入循环队列中;当循环队列满时,将循环队列中的所有元素全部出 队,并按存入的先后顺序在同一行内依次输出,即每行输出 m 个元素,每个元素后输出一个 空格。

Input
有多组数据, 每组第一行为整数序列的个数 n 和循环队列的最大容量 m (m<=n<=100, 0<m<10) ; 第二行为整数序列的各个元素。

Output
有多行数据,先输出对应行号,每行输出 m 个元素,均为偶数,每个元素后输出一个空格。

Sample Input
10 4 9 10 2 7 16 8 12 4 3 1 10 3 9 10 2 7 16 8 12 1 3 4

Sample Output
1:10 2 16 8 1:10 2 16 2:8 12 4

#include <iostream> using namespace std; const int MAXSIZE=100; void operate(int a[],int n,int m) { int front,rear,i,q[MAXSIZE],count; count=0; front=rear=m; for(i=0;i<n;i++) if(a[i]%2==0) { rear=(rear+1)%(m+1); q[rear]=a[i]; if((rear+1)%(m+1)==front)

{ cout<<++count<<':'; while(front!=rear) { front=(front+1)%(m+1); cout<<q[front]<<' '; } cout<<endl; } } } int main() { int a[MAXSIZE],i,n,m; while(cin>>n>>m) { for(i=0;i<n;i++) cin>>a[i]; operate(a,n,m); } return 0; }

1001:约瑟夫环问题
Problem Description
对任意 n 个人,密码为 m,实现约瑟夫环问题。约瑟夫环是一个数学的应用问题:已知 n 个 人(以编号 1,2,3...n 分别表示)围坐在一张圆桌周围。从编号为 1 的人开始报数,数到 m 的那个人出列;他的下一个人又从 1 开始报数,数到 m 的那个人又出列;依此规律重复下 去,直到圆桌周围的人全部出列。

Input
每行为一组数据,包括 2 个正整数 n 和 m(n,m>0)。

Output
依次写出出圈的顺序,数字之间用一个空格分隔。

Sample Input
6 3 7 3

Sample Output
3 6 4 2 5 1 3 6 2 7 5 1 4

#include<iostream> using namespace std; struct Node { int data; Node *next; }; class CLinkList { public: CLinkList(int n); ~CLinkList(){} private: //建立有 n 个元素的单循环链表 //析构函数,在出圈过程中已删除,因此可为空 //实现 n 个人密码为 m 的约瑟夫环问题

void ysf(int n,int m);

Node *first,*rear; };

//单循环链表的头指针

CLinkList::CLinkList(int n) { first=new Node; first->data=1; Node *r,*s; r=first; { s=new Node; s->data=i; r->next=s; r=s; } r->next=first; rear=r; } void CLinkList::ysf(int n,int m) { //n 表示圈内初始人数,m 表示密码,num 表示圈内当前人数,i 表示当前报的数 Node *p,*q; int num,i; num=n; i=1; q=rear; p=first; while(num>1) { if(i==m) { q->next=p->next; cout<<p->data<<" "; delete p; p=q->next; i=1; //报到密码,出圈 //也可 while(p->next!=p) //单循环链表建立完毕,将终端结点的指针域置为头指针 //为每个数组元素建立一个结点 //插入到终端结点之后 //尾指针初始化 for (int i=2; i<=n; i++)

num--; } else { q=p; p=p->next; i++; } } cout<<p->data<<endl; delete p; } int main() { int n,m; while(cin>>n>>m) { CLinkList L(n); L.ysf(n,m); } return 0; } //没有报到密码,继续

1010:火车车厢重排
Problem Description
一列货运列车共有 n 节车厢, 每节车厢将停放在不同的车站。 假定 n 个车站的编号分别为 1~n, 即货运列车按照第 n 站至第 1 站的次序经过这些车站。为了便于从列车上卸掉相应的车厢, 车厢的编号应与车站的编号相同。这样,在每个车站只需卸掉最后一节车厢。因此,对于给 定的任意次序车厢,必须进行重新排列,使其符合要求。车厢重排工作可通过转轨站完成, 在转轨站中有一个入轨、一个出轨和 k 个缓冲轨,缓冲轨位于入轨和出轨之间。假定缓冲轨 按先进先出的方式工作,现要求设计算法解决火车车厢重排问题。

Input
有多组数据,每组第一行为车厢节数 n 和缓冲轨数目 k(2<=k<=5,k<=n<=10),第二行为初 始给定的车厢编号次序序列。

Output
若给定的车厢编号次序序列可重排,则输出 1;否则输出 0。

Sample Input
9 3 9 3 3 6 9 2 4 7 1 8 5 3 6 9 2 4 7 5 8 1

Sample Output
1 0

#include<iostream> using namespace std; const int N=10+2; const int K=5+1; int Judge(int s[],int n,int k) { int a[K][N],i,j,nowout; int front,rear,t,max,res=1,flag; for(i=0;i<K;i++) { for(j=0;j<N;j++) a[i][j]=0; }

i=1;nowout=1; while(i<=n) { flag=0; if(s[i]==nowout) //当前入轨为 nowout { nowout++; flag=1; i++; } else //非空缓冲轨的队头元素为 nowout { for(j=1;j<k;j++) { front=a[j][0]; rear=a[j][N-1]; if(front!=rear&&a[j][front+1]==nowout) { nowout++; a[j][0]++; flag=1; break; } } } if(flag==0) //当前入轨和各缓冲轨队头均非 nowout { t=0;max=-1; for(j=1;j<k;j++) //找出 max(小于当前入轨的队尾)值及所在非空缓冲轨 t { front=a[j][0]; rear=a[j][N-1]; if(front!=rear&&a[j][rear]<s[i]&&a[j][rear]>max) { t=j; max=a[j][rear]; } } if(t>0) //若 t 存在,则当前入轨存入 t { rear=++a[t][N-1]; a[t][rear]=s[i]; i++; } else //t 不存在,查看是否有空缓冲轨 {

for(j=1;j<k;j++) //存在多于 1 个的空缓冲轨,则当前入轨存入 { if(a[j][0]==a[j][N-1]) { rear=++a[j][N-1]; a[j][rear]=s[i]; i++; break; } } if(j==k) //车厢无法重排,算法结束 { res=0; break; } } } } return res; } int main() { int s[N]; int i,n,k; while(cin>>n>>k) { for(i=1;i<=n;i++) cin>>s[i]; cout<<Judge(s,n,k)<<endl; } return 0; }



更多相关文章:
讲评--表2
讲评--表2_数学_高中教育_教育专区。1002:特殊的数字 Problem Description 今天...每组数据包括 2 行,第一行表示单链表的长度 n(不会超过 100);第二行 表示...
党员讲评表2
党员讲评表2_党团工作_应用文书。附件 2 硚口区党员“创先争优”活动讲评表 口区党员“创先争优” 党员讲评时间: 姓名 所在单位 姜超 性别 男年月日 1988.5...
班第 周讲评表2
班第 周讲评表2_中职中专_职业教育_教育专区。中专空白表格 班第时 间 周讲评表年 月 日至 年月日 早操应到、实到、态度 星期一 星期二 星期三 星期四 ...
安3-2-4班前安全活动、周讲评记录表
安3-2-4班前安全活动、周讲评记录表_建筑/土木_工程科技_专业资料 暂无评价|0人阅读|0次下载|举报文档 安3-2-4班前安全活动、周讲评记录表_建筑/土木_工程...
建筑材料评讲作业(2)
建筑材料评讲作业(2)_建筑/土木_工程科技_专业资料。《建筑材料》课程作业评讲...水泥细度可以采用筛析法(GB/T1345-91)和比表面积法(GB/T8074-87)测定。 ...
表8-2 淘宝网店铺情况调查分析表
表8-2 淘宝网店铺情况调查分析表调查时间:2011.12.09 手机号 序 店铺名 号称 卖家信用及好 码归属 评率 地 卖家信用: 两钻 描述相符:4.9 高于同行 54.84...
数据结构形成性考核作业2讲评
数据结构形成性考核作业2讲评_工学_高等教育_教育专区。数据结构形成性考核作业 ...3 个域 10.在广义表的存储结构中 ,单元素结点与表元素结点有一个域对应不同...
XRD分析时2θ-d值对照表
XRD分析时2θ-d值对照表_工学_高等教育_教育专区。XRD分析时2θ-d值对照表 2 θ -d 值对照表 0 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...
2011物理讲评2
2011物理讲评2 隐藏>> 2011 年全国新课标理综物理试题评析评析人:邢彦君 14.为了...若用 U 和 I 分别表示此时电压表和电流表的 读数,则 A.U=110V ,I=0.2...
副教授职称评定评审表(参考范本) 2
副教授职称评定评审表(参考范本) 2_表格类模板_表格/模板_实用文档。1、基本情况姓名 性别 民族 *** 男 汉族 出生 年月 政治 面貌 党员 6年 经济师 讲师 ...
更多相关标签:
讲评评分表    如何上好试卷讲评课    管建刚作文讲评课    试卷讲评课教案    作文讲评    试卷讲评课教学设计    作文讲评课    安全讲评台    

All rights reserved Powered by 甜梦文库 9512.net

copyright ©right 2010-2021。
甜梦文库内容来自网络,如有侵犯请联系客服。zhit325@126.com|网站地图