吉林大学2023数据结构上机1

7-2 Blah数集
分数 100
作者 谷方明
单位 吉林大学
大数学家高斯小时候偶然发现一种有趣的自然数集合Blah。以a为基的集合Ba定义如下:

a是集合Ba的基,且a是Ba的第一个元素;
若x在集合Ba中,则2x+1和3x+1也都在Ba中;
没有其它元素在集合Ba中。
现在小高斯想知道如果将集合Ba中元素按照升序排列,第n个元素会是多少?
输入格式:
多行,每行包括两个数,集合的基a(1<=a<=50))以及所求元素序号n(1<=n<=1000000)

输出格式:
对于每个输入,输出集合Ba的第n个元素值

输入样例:
在这里给出一组输入。例如:

1 5
25 100000

输出样例:
在这里给出相应的输出。例如:

9
34503679

#include <stdio.h>
long long x[1000000];
int main(void)
{
    long long a = 0, b = 0, c = 1, n, i;
    while (scanf("%lld %lld", &i, &n) != EOF)
    {
        x[0] = i;
        a = 0;
        b = 0;
        for (c = 1; c <= n; c++)
        {
            if ((x[a] * 2 + 1 == x[b] * 3 + 1))
            {
                x[c] = x[a] * 2 + 1;
                a++;
                b++;
            }
            else if (x[a] * 2 + 1 < x[b] * 3 + 1)
            {
                x[c] = x[a] * 2 + 1;
                a++;
            }
            else
            {
                x[c] = x[b] * 3 + 1;
                b++;
            }
        }
        printf("%lld\n", x[n-1]);
    }
}

报数游戏
分数 100
作者 谷方明
单位 吉林大学
n个人围成一圈,从1开始依次编号,做报数游戏。 现指定从第1个人开始报数,报数到第m个人时,该人出圈,然后从其下一个人重新开始报数,仍是报数到第m个人出圈,如此重复下去,直到所有人都出圈。总人数不足m时将循环报数。请输出所有人出圈的顺序。

输入格式:
一行,两个整数n和m。n表示游戏的人数,m表示报数出圈的数字,1≤n≤50000,1≤m≤100.

输出格式:
一行,n个用空格分隔的整数,表示所有人出圈的顺序

输入样例:
在这里给出一组输入。例如:

5 2
输出样例:
在这里给出相应的输出。例如:

2 4 1 5 3


#include<stdio.h>
int x[50000][2];
int main()
{
    int a, b, c=0, d=0,n,m;
    scanf("%d %d", &n, &m);
    for (a = 0; a < n; a++)
    {
        x[a][0] = 1;
        x[a][1] = a + 1;
    }
    a--;
    x[a][1] = 0;
    for (a = 0; a < n; a++)
    {
        for (b = 1; b < m; b++)
        {
            d = c;
            c = x[c][1];
        }
        printf("%d", c+1);
        if (a != n - 1)
            printf(" ");
        c = x[c][1];
        x[d][1] = c;
    }
    return 0;
}

 查询子序列和
分数 100
作者 谷方明
单位 吉林大学
对N个整数的序列,查询子序列和∑ 
k=i
j

 A 
k

  , (1≤i,j≤N).

输入格式:
第1行,两个整数:N和Q,表示整数的个数和查询的次数,1≤N≤100000,0≤Q≤100000.

第2行,N个用空格分开的整数 x , │x│≤20000.

第3至Q+2行,每行两个整数i和j,表示所求子序列和的区间[i,j],1≤i≤j≤N,保证所有区间都合法。

输出格式:
Q行,每行一个整数,表示相应子序列的和

输入样例:
5 3
1 2 3 4 5
1 5
2 4
3 5
输出样例:
在这里给出相应的输出。例如:

15
9
12

#include <stdio.h>
int x[100010];
int main()
{
    int n, q, a, b, c,s=0,i,j;
    scanf("%d %d", &n, &q);
    for (a = 1; a <= n; a++)
    {
        scanf("%d", &i);
        s += i;
        x[a] = s;
    }
    for (a = 1; a <= q; a++)
    {
        scanf("%d %d", &i, &j);
        printf("%d\n", x[j] - x[i-1]);
    }
    return 0;
}

等价性问题
分数 100
作者 谷方明
单位 吉林大学
等价性问题就是:给定集合S及其上的若干等价元素对,询问S上的两个元素是否等价。常见的等价性问题有亲戚关系等。等价性问题的一种模型是等价关系和等价类。

输入格式:
输入由两部分组成。

第一部分以N,M开始。N为问题涉及的元素个数,元素的编号为1,2,3,…, N。M表示等价元素对个数,1<=N,M<=100000,接下来M行,每行有两个元素ai和bi,表示ai和bi等价。

第二部分以一个整数P(1<=P<=100000)开始,表示有P次询问,接下来P行,每行有两个元素ci和di,表示询问ci和di是否等价。

输出格式:
若干行。每行表示一个询问的结果。若ci和di等价,则输出“Yes”,否则输出“No”。

输入样例:
在这里给出一组输入。例如:

6 4
1 2
1 3
5 4
5 3
3
1 4
2 3
5 6

输出样例:
在这里给出相应的输出。例如:

Yes
Yes
No


#include <stdio.h>
int x[100010];
int y[100010];
int find(int v)
{
    if (x[v] == v) return v;
    int b = 0, c ;
    while (x[v] != v)
    {
        y[b] = v;
        v = x[v];
        b++;
    }
    for (c=0; c< b; c++)
        x[y[c]] = v;
    return v;
}
int main()
{
    int a, b, c, d, n, m, q, i, j;
    scanf("%d %d", &n, &m);
    for (a = 1; a <= n; a++)
        x[a] = a;
    for (a = 1; a <= m; a++)
    {
        scanf("%d %d", &i, &j);
        b = find(i);
        c = find(j);
        x[b] = c;
    }
    scanf("%d", &q);
    for (a = 1; a <= q; a++)
    {
        scanf("%d %d", &i, &j);
        b = find(i);
        c = find(j);
        if (c == b)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值