JLU数据结构第一次上机实验
Posted 荒于曦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JLU数据结构第一次上机实验相关的知识,希望对你有一定的参考价值。
JLU数据结构第一次上机实验
重复计数
Code Size Limit 16 KB
Time Limit 1000 ms
Memory Limit 64 MB
题目描述
在一个有限的正整数序列中,有些数会多次重复出现。请你统计每个数的出现次数,然后按数字在序列中第一次出现的位置顺序输出数及其次数。
输入格式
第1行,1个整数N,表示整数的个数,(1≤N≤50000)。
第2行,N个正整数,每个整数x 都满足 1 ≤ x ≤2000000000。
输出格式
若干行,每行两个用一个空格隔开的数,第一个是数列中出现的数,第二个是该数在序列中出现的次数。
输入样例
在这里给出一组输入。例如:
12
8 2 8 2 2 11 1 1 8 1 13 13
输出样例
在这里给出相应的输出。例如:
8 3
2 3
11 1
1 3
13 2
思路
关键:按第一次出现次序输出。
方法很暴力。出现过就在相应位置频率加一,没出现过就加个位置,频率置为一。
代码
#include <iostream>
using namespace std;
typedef struct nub{
int num;
int frqcy;
}Nub;
int main() {
int nnub=0,nb=0;
scanf("%d",&nnub);
int num=0;
Nub a[nnub];
for(int i=0;i<nnub;i++){
a[i].frqcy=0;
a[i].num=0;
}
for(int i=0;i<nnub;i++){
scanf("%d",&num);
int j=0;
for(;j<nb;j++){
if(a[j].num==num){
a[j].frqcy++;
break;
}
}
if(j==nb){
a[j].num=num;
a[j].frqcy++;
nb++;
}
}
for(int i=0;i<nb;i++){
printf("%d %d\\n",a[i].num,a[i].frqcy);
}
return 0;
}
报数游戏
Code Size Limit 16 KB
Time Limit 1000 ms
Memory Limit 64 MB
题目描述
n个人围成一圈,从1开始依次编号,做报数游戏。 现指定从第1个人开始报数,报数到第m个人时,该人出圈,然后从其下一个人重新开始报数,仍是报数到第m个人出圈,如此重复下去,直到所有人都出圈。总人数不足m时将循环报数。请输出所有人出圈的顺序。
输入格式
一行,两个整数n和m。n表示游戏的人数,m表示报数出圈的数字,1≤n≤50000,1≤m≤100.
输出格式
一行,n个用空格分隔的整数,表示所有人出圈的顺序
输入样例
在这里给出一组输入。例如:
5 2
输出样例
在这里给出相应的输出。例如:
2 4 1 5 3
思路
链表。完全模拟报数的过程,报到谁就从链表删除,重复n-1次直到剩下一人。
代码
#include <iostream>
using namespace std;
typedef struct nub{
int num;
struct nub*p;
}Nub;
int main() {
int m=0;
int n=0;
Nub*p=NULL;
scanf("%d %d",&n,&m);
Nub a[n+1];
for(int i=0;i<n;i++){
a[i].num=i+1;
a[i].p=&a[i+1];
}
a[n-1].p=&a[0];
Nub*p0=&a[n-1];
p=&a[0];
for(int i=0;i<n;i++){
for(int j=0;j<m-1;j++){
p0=p0->p;
p=p0->p;
}
printf("%d",p->num);
if(i!=n-1)printf(" ");
p0->p=p->p;
p=p0->p;
}
return 0;
}
算术表达式计算
Code Size Limit 16 KB
Time Limit 400 ms
Memory Limit 64 MB
题目描述
任务: 计算算术表达式的值。
算术表达式按中缀给出,以=号结束,包括+,-,,/四种运算和(、)分隔符。运算数的范围是非负整数,没有正负符号,小于等于109 。
计算过程中,如果出现除数为0的情况,表达式的结果为”NaN” ; 如果中间结果超出32位有符号整型范围,仍按整型计算,不必特殊处理。 输入保证表达式正确。
输入格式
一行,包括1个算术表达式。算术表达式的长度小于等于1000。
输出格式
一行,算术表达式的值 。
输入样例
在这里给出一组输入。例如:
(1+30)/3=
输出样例
在这里给出相应的输出。例如:
10
思路
先把中缀表达式化为后缀表达式,然后按照后缀表达式的规则计算。
代码
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
#define Max
int kind(char c){
if(c==\'*\'||c==\'/\')return 1;
if(c==\'+\'||c==\'-\')return 2;
if(c==\'(\')return 3;
if(c==\')\')return 33;
if(c>=\'0\'&&c<=\'9\')return 4;
if(c==\'.\')return 44;
return 0;
}
int cmp(int x,int y,char c){
if(c==\'+\')return x+y;
if(c==\'-\')return x-y;
if(c==\'*\')return x*y;
if(c==\'/\'){
if(y==0)return 121380;
return x/y;
}
return 0;
}
int main(){
queue<char>fml;
stack<char>sign;
stack<int>clcl;
char c;
c=getchar();
while(c!=\'=\'){
if(kind(c)!=4){
if(sign.size()!=0){
int ck=kind(c);
switch(ck){
case 1:
case 2:{
while(sign.size()!=0&&kind(sign.top())<=ck){
fml.push(sign.top());
sign.pop();
}
sign.push(c);
break;
}
case 3:{
sign.push(c);
break;
}
case 33:{
while(kind(sign.top())!=3){
fml.push(sign.top());
sign.pop();
}
sign.pop();
break;
}
}
}else{
sign.push(c);
}
c=getchar();
}else{
while(kind(c)==4){
fml.push(c);
c=getchar();
}
fml.push(\'.\');
}
}
while(sign.size()!=0){
fml.push(sign.top());
sign.pop();
}
while(fml.size()!=0){
c=fml.front();
fml.pop();
if(kind(c)!=4){
int x,y,n;
x=clcl.top();clcl.pop();
y=clcl.top();clcl.pop();
n=cmp(y,x,c);
if(n!=121380)clcl.push(n);
else {
printf("NaN");
return 0;
}
}else{
clcl.push(0);
while(kind(c)!=44){
clcl.top()*=10;
clcl.top()+=c-\'0\';
c=fml.front();
fml.pop();
}
}
}
printf("%d",clcl.top());
return 0;
}
最喜爱的序列
Code Size Limit 16 KB
Time Limit 400 ms
Memory Limit 64 MB
题目描述
小唐这段时间在研究序列。拿来N个整数的序列,他给序列中的每个整数都赋予一个喜爱值。喜爱值也是整数,有正有负,越大表明越喜欢。他想知道,如何从序列中连续取最多m个数,他获得喜爱值最大。1≤N≤500000,1≤m≤N。
输入格式
第一行是两个整数N,m。分别代表序列中数的个数以及能取的最多个数。
第二行用空格隔开的N个整数,第i个整数Li代表他对第i个数的喜爱值。│Li│≤1000
输出格式
一行,三个数,表示获得最大喜爱值,及第一个取最大喜爱值的区间。
输入样例
在这里给出一组输入。例如:
5 2
1 4 5 2 3
输出样例
在这里给出相应的输出。例如:
9 2 3
思路
定区间数求和。先求第一个区间和,然后区间向后移动,减掉前区间第一个数,加上前区间下一个数,得到新的和。重复到完,记录最大和及其区间。
代码
我当时刚学c++的类,喜欢用类封装一些操作(啥都用类写),结果代码很麻烦,很冗余,没什么参考价值,就不展示了。
以上是关于JLU数据结构第一次上机实验的主要内容,如果未能解决你的问题,请参考以下文章