Problem Link:http://codeup.cn/problemset.php?search=%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E9%AB%98%E5%88%86%E7%AC%94%E8%AE%B0
1323: 算法2-1:集合union
题目描述
上图算法中,在第8行取得集合B中的元素,然后再在第10行插入到集合A中。你的任务是先输出集合A和集合B中的元素,每个集合在一行中输出。然后每次在将集合B中的元素取出插入到集合A尾部后输出集合A中的元素。当然你的代码可以和上面的代码不一样,只要有相同的输出即可。
输入
有多组测试数据,每组测试数据占两行。第一行是集合A,第一个整数m(0<m<=100)代表集合A起始有m个元素,后面有m个整数,代表A中的元素。第二行是集合B,第一个整数n(0<n<=100)代表集合B起始有n个元素,后面有n个整数,代表B中的元素。每行中整数之间用一个空格隔开。
输出
每组测试数据输出n+2行:前两行分别输出集合A、集合B中的数据,后面n行是每次从B中取出元素插入到A尾部后的集合A。每行整数之间用一个空格隔开,每组测试数据之间用一行空行隔开。
样例输入
样例输出
提示
来源
AC code:#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#define LL long long
#define MAXN 1000010
using namespace std;
const int INF=0x3f3f3f3f;
int A[222],B[222];
int vis[MAXN];
int main()
{
// freopen("D:\\in.txt","r",stdin);
int m,n,i,j;
while(scanf("%d",&m)!=EOF)
{
memset(vis,0,sizeof(vis));
for(i=0;i<m;i++)
{
scanf("%d",&A[i]);
vis[A[i]]=1;
}
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&B[i]);
}
printf("%d",A[0]);
for(j=1;j<m;j++)
{
printf(" %d",A[j]);
}
printf("\n");
printf("%d",B[0]);
for(j=1;j<n;j++)
{
printf(" %d",B[j]);
}
printf("\n");
for(i=0;i<n;i++)
{
if(!vis[B[i]])
{
A[m++]=B[i];
printf("%d",A[0]);
for(j=1;j<m;j++)
{
printf(" %d",A[j]);
}
printf("\n");
}
else
{
printf("%d",A[0]);
for(j=1;j<m;j++)
{
printf(" %d",A[j]);
}
printf("\n");
}
}
printf("\n");
}
return 0;
}
1324: 算法2-2:有序线性表的有序合并
题目描述
输入
有多组测试数据,每组测试数据占两行。第一行是集合A,第一个整数m(0<=m<=100)代表集合A起始有m个元素,后面有m个非递减排序的整数,代表A中的元素。第二行是集合B,第一个整数n(0<=n<=100)代表集合B起始有n个元素,后面有n个非递减排序的整数,代表B中的元素。每行中整数之间用一个空格隔开。
输出
每组测试数据只要求输出一行,这一行含有 m+n 个来自集合 A 和集合B 中的元素。结果依旧是非递减的。每个整数间用一个空格隔开。
样例输入
样例输出
提示
本题书中提供的算法是基于顺序表的。在使用顺序表时需要两倍于数据元素数目。如果使用链表则只需要存储一倍的元素。然而使用链表同样需要存储一倍的指针。所以对于这类问题数据结构的选取,如果数据域占用的空间很大则可以使用链表存储来节省空间,而对于数据域占用不大的情况,则使用顺序表也可以。
来源
AC code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#define LL long long
#define MAXN 1000010
using namespace std;
const int INF=0x3f3f3f3f;
int A[MAXN],B[MAXN],C[MAXN];
int main()
{
// freopen("D:\\in.txt","r",stdin);
int m,n,i,j,len;
while(scanf("%d",&m)!=EOF)
{
for(i=1;i<=m;i++)
{
scanf("%d",&A[i]);
}
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&B[i]);
}
i=j=1;
len=0;
while(i<=m&&j<=n)
{
if(A[i]<=B[j])
{
C[++len]=A[i];
i++;
}
else
{
C[++len]=B[j];
j++;
}
}
while(i<=m)
{
C[++len]=A[i];
i++;
}
while(j<=n)
{
C[++len]=B[j];
j++;
}
if(len!=0)
{
printf("%d",C[1]);
for(i=2;i<=len;i++)
{
printf(" %d",C[i]);
}
printf("\n");
}
else//注意为空的情况
{
printf("\n");
}
}
return 0;
}
1325: 算法2-3~2-6:Big Bang
题目描述
输入
输入数据只有一组,有很多行。每行的格式可能是下列一种:
insert a name
delete name
show
search name
其中 a 是一个整数,代表在第a个名字前插入名字。name是一个姓名,只包含英文字母的大小写,每个名字不超过30个字符。
输入保证不会插入列表中已经存在的姓名,不会删除列表中不存在的姓名,也不会搜索列表中不存在的姓名。
输出
起始时,列表是空的。只输出show和search name 的结果。show将列表中的姓名全部输出,search只输出找到该名字的序号(从1开始)。每次输出占一行,姓名间用空格隔开。如果列表中没有名字了,show时也要输出一个空行。
样例输入
样例输出
提示
来源
AC code:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define MAXN 1000010
using namespace std;
string names[111];
int len;
void insert(int pos,string name)
{
int i;
for(i=len;i>=pos;i--)
{
names[i+1]=names[i];
}
names[pos]=name;
len++;
}
int search(string name)
{
int i;
for(i=1;i<=len;i++)
{
if(names[i]==name)
return i;
}
}
void delet(string name)
{
int i,pos;
pos=search(name);
for(i=pos;i<len;i++)
{
names[i]=names[i+1];
}
len--;
}
void show()
{
int i;
if(len==0)
puts("");
else
{
cout<<names[1];
for(i=2;i<=len;i++)
{
cout<<" "<<names[i];
}
cout<<endl;
}
}
int main()
{
// freopen("D:\\in.txt","r",stdin);
string op,name;
int id;
len=0;
while(cin>>op)
{
if(op=="insert")
{
cin>>id>>name;
insert(id,name);
}
else if(op=="show")
{
show();
}
else if(op=="search")
{
cin>>name;
cout<<search(name)<<endl;
}
else if(op=="delete")
{
cin>>name;
delet(name);
}
}
return 0;
}
问题 I: 算法2-8~2-11:链表的基本操作
题目描述
输入
输出
样例输入
样例输出
提示
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define MAXN 1000010
#define ERROR 0
#define OK 1
using namespace std;
typedef int ElemType;
typedef bool Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status GetElem_L(LinkList &L,int i,ElemType &e){
LinkList p;
p=L->next;
int j=1;
while(p && j < i ){
p=p->next;
++j;
}
if(!p || j>i)
return ERROR;
e = p->data;
return OK;
}
Status ListInsert_L(LinkList &L,int i,ElemType e){
LinkList p,s;
p=L;
int j=0;
while(p && j < i-1)
{
p=p->next;
++j;
}
if(!p || j > i-1)
return ERROR;
s=(LinkList) malloc (sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete_L(LinkList &L,int i,ElemType &e){
LinkList p,q;
p=L;
int j=0;
while(p->next && j<i-1){
p=p->next;
++j;
}
if(!(p->next) || j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}
void CreateList_L(LinkList &L,int n){
LinkList p;
int i;
L=(LinkList) malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;--i){
p=(LinkList) malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}
void ShowList_L(LinkList L)
{
LinkList p;
p=L->next;
if(p==NULL) printf("Link list is empty\n");
else
{
printf("%d",p->data);//注意输出格式
p=p->next;
while(p)
{
printf(" %d",p->data);
p=p->next;
}
printf("\n");
}
}
int main()
{
// freopen("D:\\in.txt","r",stdin);
int n,m,i,e,s,cnt;
LinkList L;
char op[55];
scanf("%d",&n);
CreateList_L(L,n);
// ShowList_L(L);
scanf("%d",&m);
for(cnt=0;cnt<m;cnt++)
{
scanf("%s",op);
if(strcmp(op,"show")==0)
{
ShowList_L(L);
}
else if(strcmp(op,"delete")==0)
{
scanf("%d",&i);
s=ListDelete_L(L,i,e);
if(s==OK)
printf("delete OK\n");
else
printf("delete fail\n");
}
else if(strcmp(op,"insert")==0)
{
scanf("%d%d",&i,&e);
s=ListInsert_L(L,i,e);
if(s==OK) printf("insert OK\n");
else printf("insert fail\n");
}
else if(strcmp(op,"get")==0)
{
scanf("%d",&i);
s=GetElem_L(L,i,e);
if(s==ERROR)
printf("get fail\n");
else
printf("%d\n",e);
}
}
return 0;
}