首页 > 其他分享 >数据结构题解

数据结构题解

时间:2023-04-22 23:13:58浏览次数:32  
标签:同学 输出 int 题解 样例 整数 ## 数据结构

W1

# 怪兽训练计划1

## 题目描述

小明有一个怪兽训练计划。

初始时,怪兽充满能量,能量值为8800。如果训练怪兽,每分钟损耗能量值400;如果让怪兽休息,每分钟增加能量值200。能量的损耗和增加都是均匀变化的。

小明打算让怪兽训练一分钟、休息一分钟、再训练一分钟、再休息一分钟……如此循环,如果某个时刻怪兽的体力到达0,小明就停止训练怪兽。

请问小明在多久以后停止训练怪兽。请以秒为单位输出答案。答案钟只填写数,不填写单位。

## 输入格式

## 输出格式

输出为一个整数。

#include<iostream>
using namespace std;
int main (){
    int a=8800,b=0,i;
    for (i=1;i<=100;i++)
    {
        a=a-200;
        if (a<=200){
            a+=200;
            b=a/400 ;
            cout<<120*(i-1)+60*b<<endl;
            break;
        }

    }
    return 0;
}

W2

# 独木桥

## 题目背景

战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳 $1$ 个人通过。假如有 $2$ 个人相向而行在桥上相遇,那么他们 $2$ 个人将无法绕过对方,只能有 $1$ 个人回头下桥,让另一个人先通过。但是,可以有多个人同时呆在同一个位置。

## 题目描述

突然,你收到从指挥部发来的信息,敌军的轰炸机正朝着你所在的独木桥飞来!为了安全,你的部队必须撤下独木桥。独木桥的长度为 $L$,士兵们只能呆在坐标为整数的地方。所有士兵的速度都为 $1$,但一个士兵某一时刻来到了坐标为 $0$ 或 $L+1$ 的位置,他就离开了独木桥。

每个士兵都有一个初始面对的方向,他们会以匀速朝着这个方向行走,中途不会自己改变方向。但是,如果两个士兵面对面相遇,他们无法彼此通过对方,于是就分别转身,继续行走。转身不需要任何的时间。

由于先前的愤怒,你已不能控制你的士兵。甚至,你连每个士兵初始面对的方向都不知道。因此,你想要知道你的部队最少需要多少时间就可能全部撤离独木桥。另外,总部也在安排阻拦敌人的进攻,因此你还需要知道你的部队最多需要多少时间才能全部撤离独木桥。

## 输入格式

第一行共一个整数 $L$,表示独木桥的长度。桥上的坐标为 $1, 2, \cdots, L$。

第二行共一个整数 $N$,表示初始时留在桥上的士兵数目。

第三行共有 $N$ 个整数,分别表示每个士兵的初始坐标。

## 输出格式

共一行,输出 $2$ 个整数,分别表示部队撤离独木桥的最小时间和最大时间。$2$ 个整数由一个空格符分开。

## 样例 #1

### 样例输入 #1

```
4
2
1 3
```

### 样例输出 #1

```
2 4
```

## 提示

对于 $100\%$ 的数据,满足初始时,没有两个士兵同在一个坐标,$1\le L\le5\times 10^3$,$0\le N\le5\times10^3$,且数据保证 $N\le L$。

~~~~~~~~~~~~~~~~

#include<iostream>
#include<algorithm>
using namespace std;
int main (){
    int L, N, S, Max=0, Min=0;
    cin>>L>>N;
    for(int i=1;i<=N;i++){
        cin>>S;
        Max=max(Max,max(L-S+1,S));
        Min=max(Min,min(L-S+1,S));
        //cout<<Max<<" "<<Min<<endl;
    }
    cout<<Min<<" "<<Max<<endl;

    return 0;
}

W3

# 【深基15.例1】询问学号

## 题目描述

有 $n(n \le 2 \times 10^6)$ 名同学陆陆续续进入教室。我们知道每名同学的学号(在 $1$ 到 $10^9$ 之间),按进教室的顺序给出。上课了,老师想知道第 $i$ 个进入教室的同学的学号是什么(最先进入教室的同学 $i=1$),询问次数不超过 $10^5$ 次。

## 输入格式

第一行 $2$ 个整数 $n$ 和 $m$,表示学生个数和询问次数。

第二行 $n$ 个整数,表示按顺序进入教室的学号。

第三行 $m$ 个整数,表示询问第几个进入教室的同学。

## 输出格式

输出 $m$ 个整数表示答案,用换行隔开。

## 样例 #1

### 样例输入 #1

```
10 3
1 9 2 60 8 17 11 4 5 14
1 5 9
```

### 样例输出 #1

```
1
8
5
```

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include<iostream>
using namespace std;
int main()
{
    int n=0,m=0;
    cin>>n>>m;
    int number[n];
    for(int i=0;i<n;i++)
    {
        cin>>number[i];
    }
    int ask[m];
    for(int i=0;i<m;i++)
    {
        cin>>ask[i];
    }
    for(int i=0;i<m;i++)
    {
        cout<<number[ask[i]-1]<<endl;
    }
    return 0;
}

W4

# 队列安排

## 题目描述

一个学校里老师要将班上 $N$ 个同学排成一列,同学被编号为 $1\sim N$,他采取如下的方法:

1. 先将 $1$ 号同学安排进队列,这时队列中只有他一个人;

2. $2\sim N$ 号同学依次入列,编号为 $i$ 的同学入列方式为:老师指定编号为 $i$ 的同学站在编号为 $1\sim(i-1)$ 中某位同学(即之前已经入列的同学)的左边或右边;

3. 从队列中去掉 $M$ 个同学,其他同学位置顺序不变。

在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。

## 输入格式

第一行一个整数 $N$,表示了有 $N$ 个同学。

第 $2\sim N$ 行,第 $i$ 行包含两个整数 $k,p$,其中 $k$ 为小于 $i$ 的正整数,$p$ 为 $0$ 或者 $1$。若 $p$ 为 $0$,则表示将 $i$ 号同学插入到 $k$ 号同学的左边,$p$ 为 $1$ 则表示插入到右边。

第 $N+1$ 行为一个整数 $M$,表示去掉的同学数目。

接下来 $M$ 行,每行一个正整数 $x$,表示将 $x$ 号同学从队列中移去,如果 $x$ 号同学已经不在队列中则忽略这一条指令。

## 输出格式

一行,包含最多 $N$ 个空格隔开的整数,表示了队列从左到右所有同学的编号。

## 样例 #1

### 样例输入 #1

```
4
1 0
2 1
1 0
2
3
3
```

### 样例输出 #1

```
2 4 1
```

## 提示

**【样例解释】**

将同学 $2$ 插入至同学 $1$ 左边,此时队列为:

`2 1`

将同学 $3$ 插入至同学 $2$ 右边,此时队列为:

`2 3 1`

将同学 $4$ 插入至同学 $1$ 左边,此时队列为:

`2 3 4 1`

将同学 $3$ 从队列中移出,此时队列为:

`2 4 1`

同学 $3$ 已经不在队列中,忽略最后一条指令

最终队列:

`2 4 1`

**【数据范围】**

对于 $20\%$ 的数据,$1\leq N\leq 10$。

对于 $40\%$ 的数据,$1\leq N\leq 1000$。

对于 $100\%$ 的数据,$1<M\leq N\leq 10^5$。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int mx=1e5+10;
int n,m;
struct T{
    int l,r; 
    int d;     
}t[mx]={0};
void add(int i,int k,int f) 
{
    if(f==1)
    {
        t[k].r=t[i].r;
        t[k].l=i; 
        t[i].r=k;
        t[t[k].r].l=k;
    }
    else 
    {
        t[k].r=i;
        t[k].l=t[i].l;
        t[i].l=k;
        t[t[k].l].r=k;
    }
}
int main()
{
    int x,k,f;
    cin>>n;
    t[0].r=0,t[0].l=0;
    add(0,1,1);
    for (int i=2;i<=n;i++)
    {
        cin>>x>>f;
        add(x,i,f);
    }
    cin>>m;
    while(m--)
    {
        cin>>x;
        t[x].d=1;
    }
    for (int i=t[0].r;i;i=t[i].r)
    {
        if (t[i].d==0) 
          cout<<i<<" ";
    }
    return 0;
}

W5

# [NOIP2009 普及组] 多项式输出

## 题目描述

一元 $n$ 次多项式可用如下的表达式表示:

$$f(x)=a_nx^n+a_{n-1}x^{n-1}+\cdots +a_1x+a_0,a_n\ne 0$$

其中,$a_ix^i$ 称为 $i$ 次项,$a_i$ 称为 $i$ 次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:

1. 多项式中自变量为 $x$,从左到右按照次数递减顺序给出多项式。

2. 多项式中只包含系数不为 $0$ 的项。

3. 如果多项式 $n$ 次项系数为正,则多项式开头不出 `+` 号,如果多项式 $n$ 次项系数为负,则多项式以 `-` 号开头。

4. 对于不是最高次的项,以 `+` 号或者 `-` 号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于 $0$ 次的项,其系数的绝对值为 $1$,则无需输出 $1$)。如果 $x$ 的指数大于 $1$,则接下来紧跟的指数部分的形式为“$x^b$”,其中 $b$ 为 $x$ 的指数;如果 $x$ 的指数为 $1$,则接下来紧跟的指数部分形式为 $x$;如果 $x$ 的指数为 $0$,则仅需输出系数即可。

5. 多项式中,多项式的开头、结尾不含多余的空格。

## 输入格式

输入共有 $2$ 行

第一行 $1$ 个整数,$n$,表示一元多项式的次数。

第二行有 $n+1$ 个整数,其中第 $i$ 个整数表示第 $n-i+1$ 次项的系数,每两个整数之间用空格隔开。

## 输出格式

输出共 $1$ 行,按题目所述格式输出多项式。

## 样例 #1

### 样例输入 #1

```
5
100 -1 1 -3 0 10
```

### 样例输出 #1

```
100x^5-x^4+x^3-3x^2+10
```

## 样例 #2

### 样例输入 #2

```
3
-50 0 0 1
```

### 样例输出 #2

```
-50x^3+1
```

## 提示

NOIP 2009 普及组 第一题

对于100%数据,$0 \le n \le 100$,$-100 \le $系数$ \le 100$

---

$\text{upd 2022.8.1}$:新增加一组 Hack 数据。

~~~~~~~~~~~~~~~~~~~~

#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
    int n,a;
    cin>>n;
    int i=n;
    while(n!=-1){
        cin>>a;
        if(a){
            if(n!=i&&a>0)cout<<"+";
            if(a*a>1||n==0)cout<<a;
            if(a==-1&&n)cout<<"-";
            if(n>1)cout<<"x^"<<n;
            if(n==1)cout<<"x";
            
        }
    n--;
    }
    return 0;
}

W6

# 【模板题】冒泡排序

## 题目描述

读入$N$个整数,利用**冒泡排序法**对这些数排序,输出排序后的$N$个数,两个数之间用空格间隔。

这里排序指的是升序。

## 输入格式

两行,第一行一个正整数$N$,表示待排序的数的个数。

第二行为$N$个整数。

## 输出格式

一行,排序后的$N$个数。

## 样例 #1

### 样例输入 #1

```
5
4 2 4 5 1
```

### 样例输出 #1

```
1 2 4 4 5
```

## 提示

$1\leq N\leq 10^3$

每个数不超过$10^9$.

~~~~~~~~~~~~~~~~~

#include<iostream>
using namespace std;
int main(){
    int a[1000];
    int n;
    cin>>n;
    for(int i=0;i!=n;i++){
        cin>>a[i];
    }
    int i, j;  
    for (i = 0; i < n; i++)  
        for (j = 1; j < n - i; j++)  
            if (a[j - 1] > a[j])  
                swap(a[j - 1], a[j]);
    for(int i=0;i!=n;i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

W7

# 【模板题】简单选择排序

## 题目描述

读入$N$个整数,利用简单选择排序法对这些数排序,输出排序后的$N$个数,两个数之间用空格间隔。

这里排序指的是升序。

## 输入格式

两行,第一行一个正整数$N$,表示待排序的数的个数。

第二行为$N$个整数。

## 输出格式

一行,排序后的$N$个数。

## 样例 #1

### 样例输入 #1

```
5
4 2 4 5 1
```

### 样例输出 #1

```
1 2 4 4 5
```

## 提示

$1\leq N\leq 10^3$

每个数不超过$10^9$.

~~~~~~~~~~~~~~~~~~~~

#include<iostream>
using namespace std;
int main(){
    int N,min=0;
    cin>>N;
    int a[N];
    for(int i=0;i<N;i++){
        cin>>a[i];
    }
    for(int i=0;i<N;i++){
        min=i;
        for(int j=i;j<N;j++){
           if(a[j]<a[min]) min=j;
        }
        if(min!=i) swap(a[i],a[min]);
    }
    for(int i=0;i<N;i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

 

标签:同学,输出,int,题解,样例,整数,##,数据结构
From: https://www.cnblogs.com/anarchyyy/p/17344397.html

相关文章

  • wsl2中docker启动不了的问题解决方法
    在wsl2的ubuntu系统中安装docker后,sudoservicedockerstart一直启动不起来在网上找到了解决方案https://juejin.cn/post/7197594278083919932解决方法这个错误提示通常是因为系统中使用的是经过修改的nftables,而Docker安装程序使用iptables进行NAT。为了解决这个问......
  • 题解 CF825E【Minimal Labels】
    偶然间翻到三个月前写的这个题,发现现有的题解均未给出解法的正确性证明,只是不明不白地写了一些对理解做法毫无帮助的话。我认为解法的正确性并不显然,因此这篇题解主要给出正确性证明,补上逻辑漏洞。解法与其他题解一样,即:建反图,然后跑拓扑排序,每次优先取出可以取出的编号最大的点,从......
  • 第九周题解QAQ
    A-Howmanyprimenumbers1#include<iostream>2usingnamespacestd;3boolisprime(intx)//判断素数(朴素版方法)4{5if(x<2)returnfalse;6for(inti=2;i<=x/i;i++)7if(x%i==0)returnfalse;8returntrue;9}10int......
  • CF1714D 题解
    CF1714D题解description给定黑色文本\(t\)和\(n\)个字符串\(s_1,s_2...s_n\).一次操作可以将\(t\)中与\(s_i\)相等的子串涂成红色。一个位置多次涂色后仍是红色。\(s_i\)可以使用多次。求将\(t\)涂成红色的最小次数,并输出方案。无解输出-1.\(|t|\leq100\)......
  • 【中级软件设计师】—(针对上午题)数据结构(二十八)
    【中级软件设计师】—(针对上午题)数据结构(二十八)一、时间复杂度二、空间复杂度123456递归的时间复杂度和空间复杂度......
  • 题解:【CF235D】Graph Game
    题目链接根据期望的线性性,一次操作使得接下来要递归处理\(|G|\)个点,将这些贡献分摊到\(|G|\)个点上,这样我们接下来只需要计算概率。首先考虑如果是树怎么做。操作等价于随机一个排列,顺次删掉排列中的点,并求出删掉当前点之前其所处的连通块的大小。记当前\(x\)为点分治中心......
  • redis数据结构
    ZipListziplist是一种特殊的“双向链表”,由一系列特殊编码的连续内存组成,可以在任意一端进行压入和弹出。ZipList的结构ZipListEntry的结构entry并不像普通双向链表节点用两个指针指向前后节点,为了节省空间。previous_entry_length:前一个节点的长度,占1个或5个字节如果......
  • 【中级软件设计师】—(针对上午题)数据结构(二十九)
    【中级软件设计师】—(针对上午题)数据结构(二十九)一、查找平均查找长度二、顺序查找三、折半查找(二分查找)1234567......
  • 二叉树经典题解
    目录......
  • winform设置背景图闪屏问题解决
    直接将以下代码复制粘贴到出现闪屏的窗体中即可:#region解决添加背景图片时闪屏的问题protectedoverrideCreateParamsCreateParams{get{CreateParamscp=base.CreateParams;cp.Ex......