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数据结构第一次上机实验的主要内容,如果未能解决你的问题,请参考以下文章

JLU数据结构第二次上机实验

第一次上机实验

SDN第一次上机实验

SDN第一次上机实验

上机实验报告

A1-2017级算法上机第一次练习赛 L Bamboo的OS实验