访问次数:

Wenji's blog
头部背景图片
WenJi's blog |
WenJi's blog |

多项式运算(北林oj)

2018-10-12

此题有很多点,比较麻烦,主要是自己确实想的比较简单,不过最终通过各种限制还是做出来了。
描述
据说每一个搞ACM的上辈子都是脑细胞死光钻到牛角尖里出不来的天使哦,可ACMer也会经常遇到些很简单的难题,比如a+b,找数列最大值……bluestone最近就遇到了这样的简单难题,Professor给她出了道一元多项式运算的题,但是bluestone做了一天没能做出来,于是她前来请教在座聪明的各位,看谁最先能帮bluestone解决这个problem??她会灰常感激的哦~

bluestone给大家提个醒:类似以下式子的称为一元多项式:

f(x)=ax^n+bx^m+……+k

如果给出x的值,我们马上就能算出f(x)了吧~

输入
输入第一行,是一个整数T(0<T<=100),表示一共有T组测试数据,以下紧跟T组测试数据,每组第一行是一个X(0<=X<=10000),表示X的值;第二行是一个一元多项式,多项式的长度不会超过100。只进行多项式加减运算,保证最后运算的结果始终在int范围内,输入格式请参见样例。

输出
每组测试数据输出占一行,输出最后的结果,具体格式请严格参考样例(注意空格)

样例输入1 复制
2
2
2X^2+3X+1
3
X+1
样例输出1
Case #1:15
Case #2:4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
string s;
int deal(int x,int start,int end)
{
if(start>end)//处理特殊情况,处理+或-号在多项式最前端或最后端
return 0;
int s1=1; //处理前面系数乘数,如果为省略1时则为1
int i=start;
if(s[start]!='X')
{s1=s[start]-'0'; //如果不省略,记下大小
for(i=start+1;i<=end&&s[i]!='X';i++)
{
s1=s1*10+s[i]-'0';
}}
int s2;
if(s[i]=='X'||s[start]=='X') //处理含有X的项时候默认为乘方1
s2=1;
else s2=0; //不含有X,那X乘方为0
if((i+2)<=end) //处理乘方数
s2=s[i+2]-'0';
for(int u=i+3;u<=end;u++)
{
s2=s2*10+s[u]-'0'; //乘方数大小
}
int s3=1; //如果X不存在,默认为1。如果乘方为0,默认也为1
while(s2--) //如果X存在,进行相关乘方处理
{
s3=s3*x;
}
if(s1==0) //特殊情况乘数为0
return 0;
else
return s1*s3;
}
int main()
{
int n;
cin>>n;
int NUM=1;
for(int i=1;i<=n;i++)
{
s.clear();
int x;
cin>>x;
cin>>s;
int start=0;
int end=0;
int sum=0;
int flag=1; //进行第一个符号处理设的 ,+为1,-为0
for(int u=0;u<s.length();u++)
{
if(s[u]=='+'||s[u]=='-') // 遇到符号,对符号之前的式子处理
{
end=u-1; //定位之前的end
if(flag) //式子之前的符号
{
sum+=deal(x,start,end);
}
else
{
sum-=deal(x,start,end);
}
start=u+1;
if(s[u]=='+') //为下一个式子准备
flag=1;
else
flag=0;
}
}
end=s.length()-1; //式子末尾特殊处理
if(flag)
sum+=deal(x,start,end);
else
sum-=deal(x,start,end);
printf("Case #%d:%d\n",NUM,sum);
NUM++;
}
return 0;
}

猴子选大王问题(循环链表和删除)

2018-10-12

描述
一堆猴子都有编号,编号是1,2,3 …m,这群猴子(m个)按照1~m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。利用单向循环链表模拟此过程,依次输出出圈的猴子编号。

输入
多组数据,每组数据占一行,包括两个数据m和n。m代表猴子个数,n代表步数,m=0且n=0时输入结束。

输出
依次输出出圈的猴子编号,编号之间用空格隔开。

样例输入1 复制
10 4
8 3
0 0
样例输出1
4 8 2 7 3 10 9 1 6 5
3 6 1 5 2 8 4 7

其中有几点错误,这些错误应该在仔细分析后找到,但是自己总是异想天开。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define OK 1
using namespace std;
typedef struct
{
int id;
}Houzhi;
typedef struct LNode
{
Houzhi data;
struct LNode *next;
}LNode,*LinkList;
LinkList L;
bool InintList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
int main()
{
int n;//猴子数
int m;//步数
while(scanf("%d%d",&n,&m))
{
InintList(L);
L->next=new LNode;
LNode *p=L->next;
LNode *pre=L;
if(n==0&&m==0)
{
break;
}
else
{
for(int i=1;i<=n;i++)//循环链表建立
{
p->data.id=i;
p->next=new LNode;
p=p->next;
pre=pre->next;
}
pre->next=L; //连接
}
int num=0;
LNode *p2=L;
LNode *pre2=pre; //尾节点
while(L!=L->next) //循环条件
{
for(int i=1;i<=m;i++)
{
p2=p2->next;
if(pre2->next!=p2) //这个一定要判断,不然在删除结点后,pre2会和p2重叠
pre2=pre2->next;
if(p2==L) //头节点的原因
{
p2=p2->next;
pre2=pre2->next;
}
}
num++;
if(num<n)
cout<<p2->data.id<<" ";
else if(num==n)
{
cout<<p2->data.id<<endl;//这个endl易掉,不然过不了
}
pre2->next=p2->next;
}
}
return 0;
}

北林oj公司营收

2018-10-11

公司营收
发布时间: 2018年3月22日 14:56 最后更新: 2018年3月22日 14:56 时间限制: 1000ms 内存限制: 128M

描述
一些公司之间有合作关系,会计小张想了解大家的贸易额的多少。在这个问题中的各家公司都有一个固定的资产输出,而这些资产输出将被平均分给和这家公司有贸易公司的人。但是,这些公司中,有些公司的资产输出较多,有些则较少。给出小张要统计的公司名称(均小于20字符),给出每个公司的资产输出和与这家公司有贸易关系的公司列表,请确定每家公司贸易收入大于贸易支出的数量。

输入
输入第1行为一个T,表示公司数量(2≤T≤10),输入第2~T+1行,表示所有的公司名称,每行对应一个公司名称。
第T+2行到最后,为多组输入数据:每组中第一行为公司名,第二行包含两个数据,分别是第一行对应公司的贸易输出额度(0-4000),第二个数据是这家公司有贸易的公司数量K,接下来K行,每行分别写了这K个公司中的一个的名称。(对其余公司的贸易输出额度可以理解为输出总额度除以其余公司的数量取整,若除不尽,则多出来的额度不用算进贸易输出额度中)

输出
输出T行,每行是一个公司名以及它的贸易收入比贸易支出多的额度,以空格隔开。

样例输入1 复制
5
KFC
Subway
ETS
Intel
AMD

KFC
200 3
Subway
ETS
Intel

ETS
500 1
KFC

AMD
150 2
Intel
ETS

Subway
0 2
AMD
Intel

Intel
0 0
样例输出1
KFC 302
Subway 66
ETS -359
Intel 141
AMD -150

注意里面几个点,还是一道简单题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<iostream>
#include<cstdio>
using namespace std;
struct gongshi
{
string name;
int ziran;
}go[12];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>go[i].name;
go[i].ziran=0;
}
string s1;
int sum;
int m;
string s2;
int k=1;
while(k<=n&&cin>>s1)//这个k<=n要在&&前面,不能在&&后面否则会很搞笑,由于执行的顺寻
{
cin>>sum>>m;
k++;
if(m==0)//m=0的情况要考虑
continue;
int Sum=sum/m;
int yushu=sum-Sum*m;
for(int i=1;i<=n;i++)
{
if(go[i].name==s1)
{
go[i].ziran=go[i].ziran+yushu-sum;//这里容易把之前的ziran忘记加
break;
}
}
for(int i=1;i<=m;i++)
{
cin>>s2;
for(int u=1;u<=n;u++)
{
if(go[u].name==s2)
{
go[u].ziran+=Sum;
break;
}
}
}
}
for(int i=1;i<=n;i++)
{
cout<<go[i].name<<" "<<go[i].ziran<<endl;
}
return 0;
}

基于链存储结构的图书信息表的图书去重

2018-10-07

这道题有个continue会跳过for的第三段,是去重的关键
描述
出版社出版的任何一本图书的书号(ISBN)都是唯一的,即图书表中不允许包含书号重复的图书。定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据来完成图书信息表的创建(书号可能重复),然后进行图书的去重,即删除书号重复的图书(只保留第一本),最后输出去重后所有图书的信息。

输入
总计输入n+1行,其中,第一行是图书数目n,后n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格(书号可能重复)。其中书号和书名为字符串类型,价格为浮点数类型。

输出
总计输出m+1行(m≤n),其中,第一行是去重后的图书数目,后m行是去重后图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。

样例输入1 复制
9
9787302257646 Data-Structure 35.00
9787302164340 Operating-System 50.00
9787302219972 Software-Engineer 32.00
9787302203513 Database-Principles 36.00
9787810827430 Discrete-Mathematics 36.00
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787811234923 Compiler-Principles 62.00
9787822234110 The-C-Programming-Language 38.00
样例输出1
8
9787302257646 Data-Structure 35.00
9787302164340 Operating-System 50.00
9787302219972 Software-Engineer 32.00
9787302203513 Database-Principles 36.00
9787810827430 Discrete-Mathematics 36.00
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787822234110 The-C-Programming-Language 38.00

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define OK 1
using namespace std;
typedef struct
{
char no[20];
char name[50];
float price;
}Book;
typedef struct LNode
{
Book data;
struct LNode *next;
}LNode,*LinkList;
LinkList L;
bool InintList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
int main()
{
int num;
InintList(L);
cin>>num;
LNode *pre=L;//pre非常关键,这个是为了让链表最后一端为NULL
for(int i=0;i<num;i++)
{
LNode *p=new LNode;
scanf("%s%s%f",p->data.no,p->data.name,&p->data.price);
pre->next=p;
pre=p;
}
pre->next=NULL;//结尾加入NULL
//之前创建的链表没有NULL节点,不太好,这里会有问题,但是现在有NULL了
LNode *it=L->next->next;
pre=L->next;
for(;it!=NULL;it=it->next,pre=pre->next)
{
if(strcmp(pre->data.no,it->data.no)==0)
{
pre->next=it->next;
it=it->next;
num--;
continue;//这里会跳过接下来的操作,也就是说for第三段的也不执行
}
}
it=L->next;
cout<<num<<endl;
while(it)
{
printf("%s %s %.2f\n",it->data.no,it->data.name,it->data.price);
it=it->next;
}
return 0;
}

基于链式存储结构的图书信息表的旧图书的出库

2018-10-07

描述
定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据来完成图书信息表的创建,然后根据指定的待出库的旧图书的位置,将该图书从图书表中删除,最后输出该图书出库后的所有图书的信息。

输入
总计n+2行。首先输入n+1行,其中,第一行是图书数目n,后n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。其中书号和书名为字符串类型,价格为浮点数类型。之后输入第n+2行,内容仅为一个整数,代表待删除的旧图书的位置序号。

输出
若删除成功:

输出旧图书出库后所有图书的信息(书号、书名、价格),总计n-1行,每行是一本图书的信息,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

若删除失败:

只输出以下一行提示:抱歉,出库位置非法!

样例输入1 复制
8
9787302257646 Data-Structure 35.00
9787302164340 Operating-System 50.00
9787302219972 Software-Engineer 32.00
9787302203513 Database-Principles 36.00
9787810827430 Discrete-Mathematics 36.00
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787822234110 The-C-Programming-Language 38.00
2
样例输出1
9787302257646 Data-Structure 35.00
9787302219972 Software-Engineer 32.00
9787302203513 Database-Principles 36.00
9787810827430 Discrete-Mathematics 36.00
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787822234110 The-C-Programming-Language 38.00

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define OK 1
using namespace std;
typedef struct
{
char no[20];
char name[50];
float price;
}Book;
typedef struct LNode
{
Book data;
struct LNode *next;
}LNode,*LinkList;
LinkList L;
bool InintList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
int main()
{
int num;
InintList(L);
cin>>num;
LNode *pre=L;//pre非常关键,这个是为了让链表最后一端为NULL
for(int i=0;i<num;i++)
{
LNode *p=new LNode;
scanf("%s%s%f",p->data.no,p->data.name,&p->data.price);
pre->next=p;
pre=p;
}
pre->next=NULL;
int position=0;
cin>>position;
pre=L;
LNode *it=L->next;
if(position<=0||position>=num)
{
printf("Sorry, the storage location is illegal!\n");
}
else
{//之前创建的链表没有NULL节点,不太好,这里会有问题,但是现在有NULL了
for(int i=1;i<=num;i++,pre=pre->next,it=it->next)
{
if(i==position)
{
pre->next=it->next;
break;
}
}
it=L->next;
while(it)
{
printf("%s %s %.2f\n",it->data.no,it->data.name,it->data.price);
it=it->next;
}
}
return 0;
}

基于链式存储结构的图书信息表的新图书的入库

2018-10-07

描述
定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据来完成图书信息表的创建,然后根据指定的待入库的新图书的位置和图书的信息,将新图书插入到图书表中指定的位置上,最后输出新图书入库后的所有图书的信息。

输入
总计n+3行。首先输入n+1行,其中,第一行是图书数目n,后n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。其中书号和书名为字符串类型,价格为浮点数类型。之后输入第n+2行,内容仅为一个整数,代表待入库的新图书的位置序号。最后输入第n+3行,内容为新图书的信息,书号、书名、价格用空格分隔。

输出
若插入成功:

输出新图书入库后所有图书的信息(书号、书名、价格),总计n+1行,每行是一本图书的信息,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

若插入失败:

只输出以下一行提示:抱歉,入库位置非法!

此题纠正了之前链表创建,结尾没有NULL的问题,就是用一个pre前点指针。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define OK 1
using namespace std;
typedef struct
{
char no[20];
char name[50];
float price;
}Book;
typedef struct LNode
{
Book data;
struct LNode *next;
}LNode,*LinkList;
LinkList L;
bool InintList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
int main()
{
int num;
InintList(L);
cin>>num;
LNode *pre=L;//pre非常关键,这个是为了让链表最后一端为NULL
for(int i=0;i<num;i++)
{
LNode *p=new LNode;
scanf("%s%s%f",p->data.no,p->data.name,&p->data.price);
pre->next=p;
pre=p;
}
pre->next=NULL;
int position=0;
cin>>position;
pre=L;
LNode *NEW=new LNode;
LNode *it=L->next;
scanf("%s%s%f",NEW->data.no,NEW->data.name,&NEW->data.price);
if(position<=0||position>=(num+1))
{
printf("Sorry, the storage location is illegal!\n");
}
else
{//之前创建的链表没有NULL节点,不太好,这里会有问题,但是现在有NULL了
for(int i=1;i<=num+1;i++,pre=pre->next,it=it->next)
{
if(i==position)
{
pre->next=NEW;
NEW->next=it;
break;
}
}
it=L->next;
while(it)
{
printf("%s %s %.2f\n",it->data.no,it->data.name,it->data.price);
it=it->next;
}
}
return 0;
}

基于链式存储结构的图书信息表的最爱图书的查找

2018-10-05

描述
定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据来完成图书信息表的创建,然后根据指定的最爱图书的名字,查找最爱的图书,输出相应图书的信息。

输入
总计n+m+2行。首先输入n+1行,其中,第一行是图书数目n,后n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。其中书号和书名为字符串类型,价格为浮点数类型。然后输入m+1行,其中,第一行是一个整数m,代表查找m次,后m行是每次待查找的最爱图书名字。

输出
若查找成功:

总计输出m*(k+1)行,对于每一次查找,第一行是最爱图书数目(同一书名的图书可能有多本),后k行是最爱图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。

若查找失败:

只输出以下提示:抱歉,没有你的最爱!

样例输入1 复制
8
9787302257646 Data-Structure 35.00
9787302164340 Operating-System 50.00
9787302219972 Software-Engineer 32.00
9787302203513 Database-Principles 36.00
9787810827430 Discrete-Mathematics 36.00
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787822234110 The-C-Programming-Language 38.00
2
Java-Programming-Language
Data-Structure
样例输出1
Sorry,there is no your favourite!
2
9787302257646 Data-Structure 35.00
9787302257800 Data-Structure 62.00

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define OK 1
using namespace std;
typedef struct
{
char no[20];
char name[50];
float price;
}Book;
typedef struct LNode
{
Book data;
struct LNode *next;
}LNode,*LinkList;
LinkList L;
bool InintList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
int main()
{
int num;
InintList(L);
cin>>num;
LNode *p=new LNode;
L->next=p;
for(int i=0;i<num;i++)
{
scanf("%s%s%f",p->data.no,p->data.name,&p->data.price);
p->next=new LNode;
p=p->next;
}
int NUM=0;
cin>>NUM;
char NAME[50];
while(NUM--)
{
LinkList S;
InintList(S);
scanf("%s",NAME);
int count=0;
LNode *p1=new LNode;
S->next=p1;
//LNode *p1=S->next; //有问题,这样写不够。要写
LNode *it=L->next;
while(it)
{
if(strcmp(it->data.name,NAME)==0)
{
count++;
strcpy(p1->data.no,it->data.no);
strcpy(p1->data.name,it->data.name);
p1->data.price=it->data.price;
p1->next=new LNode;
p1=p1->next;
}
it=it->next;
}
if(count==0)
{
printf("Sorry,there is no your favourite!\n");
}
else
{
cout<<count<<endl;
LNode *p2=S->next;
while(count--)
{
printf("%s %s %.2f\n",p2->data.no,p2->data.name,p2->data.price);
p2=p2->next;
}
}
}
return 0;
}

基于链式存储结构的图书信息表的逆序存储

2018-10-05

描述
定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据来完成图书信息表的创建,然后将读入的图书逆序存储,逐行输出逆序存储后每本图书的信息。

输入
输入n+1行,第一行是图书数目n,后n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。其中书号和书名为字符串类型,价格为浮点数类型。

输出
总计n行,第i行是原有图书表中第n-i+1行的图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

样例输入1 复制
8
9787302257646 Data-Structure 35.00
9787302164340 Operating-System 50.00
9787302219972 Software-Engineer 32.00
9787302203513 Database-Principles 36.00
9787810827430 Discrete-Mathematics 36.00
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787822234110 The-C-Programming-Language 38.00
样例输出1
9787822234110 The-C-Programming-Language 38.00
9787811234923 Compiler-Principles 62.00
9787302257800 Data-Structure 62.00
9787810827430 Discrete-Mathematics 36.00
9787302203513 Database-Principles 36.00
9787302219972 Software-Engineer 32.00
9787302164340 Operating-System 50.00
9787302257646 Data-Structure 35.00
查看隐藏信息

本题最开始没有理解题意,导致我先顺序存储,在进行逆序存储。
没有任何思路,之后看了题解,发现原来最开始就是逆序存储。
然后有一个优化,就是在循环里面定义LNode *p=new LNode。
然后其他都还好。
代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define OK 1
using namespace std;
typedef struct
{
char no[20];
char name[50];
float price;
}Book;
typedef struct LNode
{
Book data;
struct LNode *next;
}LNode,*LinkList;
LinkList L;
bool InintList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
int main()
{
int num;
InintList(L);
L->next=NULL;
cin>>num;
for(int i=0;i<num;i++)
{
LNode *p=new LNode;
scanf("%s%s%f",p->data.no,p->data.name,&p->data.price);
p->next=L->next;
L->next=p;
}
LNode *it=L->next;
while(it)
{
printf("%s %s %.2f\n",it->data.no,it->data.name,it->data.price);
it=it->next;
}
return 0;
}

威海归来

2018-10-04

这篇感想就是小学生的纪实,没有营养,因为我特别想睡,现在。

国庆去了威海,见了高中的老同学张。和北理的高中同学蔡一起坐了高铁过去。
一路上感受到和谐号302的速度,然后这一切确实让我非常激动。这次也算是
真正意义上体验吧。路上蔡拿出一本书,一本福尔摩斯,真的让我很惊讶。确实
高铁有放书的地方,为什么不去放书。就是这样,我最终决定下次我也要带书。
看算法的我,最终还是看起了体育新闻。在路上也和蔡聊了很多。关于学习方面
的,还有保研考研,还有未来的工作方向,真的也算是了解到很多名校的学习,
让我受益匪浅,学习是非常重要的,当然还有很多其他方面。
蔡是学武器和引信的,感觉以后找工作是非常好找的。非常对口,感觉蔡以后会非常厉害。
但是学计算机的我,也会努力的,大家都很棒。蔡应该能保研吧,我是
这样想的,他毕竟当年和我同卓,然后理综考了290高考,太强了。
去了威海之后,第一天我们还是非常激动的,兴奋的。我们爬了一座大山。这是威海大学的大山。
上面有天文台,然后我们决定一直往上爬,然后终于爬到了顶上,遥看大海,真的很棒,
然后大家流下了合照,非常有意思的表情包。
然后….
明天再写,太累了。(明天也不写了,就这样吧)

基于链式存储结构的图书信息表的排序

2018-09-28

此题也花费一定的时间,不过确实加深了理解
由于链表不能用sort,所以排序我就用了最笨的方法。
然后此题特别搞笑,两个地方都要用降序。
name和price,之前的顺序表就没有。。。
之间需要定义一些记录量,来帮助断连。
此题以后有更好的方法,会来更新。
附上代码。

描述
定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据完成图书信息表的创建,然后将图书按照价格降序排序,逐行输出排序后每本图书的信息。

输入
输入n+1行,前n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1行是输入结束标志:0 0 0(空格分隔的三个0)。其中书号和书名为字符串类型,价格为浮点数类型。

输出
总计n行,每行是一本图书的信息(书号、书名、价格),书号、书名、价格用空格分隔。其中价格输出保留两位小数。

样例输入1 复制
9787302257646 Data-Structure 35.00
9787302164340 Operating-System 50.00
9787302219972 Software-Engineer 32.00
9787302203513 Database-Principles 36.00
9787810827430 Discrete-Mathematics 36.00
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787822234110 The-C-Programming-Language 38.00
0 0 0
样例输出1
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787302164340 Operating-System 50.00
9787822234110 The-C-Programming-Language 38.00
9787810827430 Discrete-Mathematics 36.00
9787302203513 Database-Principles 36.00
9787302257646 Data-Structure 35.00
9787302219972 Software-Engineer 32.00

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define OK 1
using namespace std;
typedef struct
{
char no[20];
char name[50];
float price;
}Book;
typedef struct LNode
{
Book data;
struct LNode *next;
}LNode,*LinkList;
LinkList L;
LNode *pre;
bool InintList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
int main()
{
InintList(L);
LNode *p=new LNode;
L->next=p;
while(scanf("%s%s%f",p->data.no,p->data.name,&p->data.price))
{

if(p->data.no[0]=='0'&&p->data.name[0]=='0'&&((p->data.price-0.0)<1e-6))
{
break;
}
else
{
pre=p;
p->next=new LNode;
p=p->next;
}
}
pre->next=NULL;
LNode *it;
float MAX;
LNode *pp;//记录最大值的位置
LNode *j;//在每个位置遍历
LNode *q;//移动时候前面那一个,来记录,并进行连接
LNode *qq;//记录it前面的位置
for(j=L;j!=NULL;)
{
MAX=j->next->data.price; //每次对MAX都要初始化
pp=j->next; //记录都要初始化 ,以防下面的for没有得到相关的值
qq=j; // 记录都要初始化,以防下面的for没有得到相关的值
for(it=j->next,q=j;it!=NULL;it=it->next,q=q->next)
{
if(it->data.price>MAX||((fabs(it->data.price-MAX)<1e-6)&&strcmp(it->data.name,pp->data.name)>0))
{ //根据题意发现价格按降序,价格相同,名称也按降序。
MAX=it->data.price;
pp=it;
qq=q;
}
}
if(pp!=j->next) //进行节点更新,最大点到前面的位置,然后连接去掉最大点的两个点
{
qq->next=pp->next;
pp->next=j->next;
j->next=pp;
}
j=pp; //循环下一次的条件
if(j->next==NULL) //比较关键的一点,设置跳出条件,不然程序会一直run下去,考虑最后一个点的情况。
{
break;
}
}
it=L->next;
while(it!=NULL)
{
printf("%s %s %.2f\n",it->data.no,it->data.name,it->data.price);
it=it->next;
}
return 0;
}