学习编程中的Ben 发表于 2023-8-13 12:50:56

c++问题求助

# 202308G 小粉兔处理题解审核志愿者轮换

## 题目背景

又到了一周的周日,扶苏又像催命一样开始催促小粉兔处理题解审核志愿者的轮换。但是懒狗小粉兔总是把这项工作拖到第二天凌晨。

【这里有一张内部群聊图,但是因为工作群信息应保密,所以这张图被和谐了】

## 题目描述

每周都有若干名题解审核志愿者处理题解审核工作。每周末轮换时,本周的志愿者中会有若干人退出工作,其余人继续下周工作;此外,还有若干新人参与下周工作。

每周末,扶苏会给小粉兔提供如下三组信息:

- 本周的题解审核志愿者名单。
- 本周有哪些题解审核志愿者退出工作。
- 下周有哪些新人参与工作。

因为小粉兔忙着玩原神,所以小粉兔求着扶苏来处理轮换。但是扶苏忙着给洛谷入门赛造题,所以请你来给出下周的题解审核志愿者名单。扶苏承诺,只要你正确地给出名单,她将把小粉兔在头图中给出的辈分分一半给你。

## 输入格式

第一行有三个整数,依次表示本周题解审核志愿者数量 $n$,退出工作的题解审核志愿者数量 $m$,和参与工作的新人数量 $l$。

接下来 $n$ 行,每行一个字符串,表示一个本周题解审核志愿者的用户名。   
接下来 $m$ 行,每行一个字符串,表示一个退出下周工作的本周题解审核志愿者的用户名。
接下来 $l$ 行,每行一个字符串,表示一个下周将参与工作的新题解审核志愿者的用户名。

## 输出格式

输出若干行,每行一个字符串。

按字典序从小到大的顺序输出下周所有题解审核志愿者的用户名。

## 样例 #1

### 样例输入 #1

```
5 4 1
10circle
yltx
Buffet
Kevin
lihanwen12
yltx
Buffet
Kevin
lihanwen12
PinkieRabbitMinus154
```

### 样例输出 #1

```
10circle
PinkieRabbitMinus154
```

## 提示

### 数据规模与约定

| 测试点编号 | $n \leq$ | $m \leq$ | $l \leq$|
| :----------: | :----------: | :----------: | :----------: |
|$1$ | $1$ | $0$   | $0$ |
|$2,3$| $100$ | $0$ | $0$ |
| $4,5$ | $100$ | $100$ | $0$ |
| $6,7$ | $100$| $0$ | $100$ |
|$8, 9$ | $100$ | $100$ | $100$ |
| $10$| $10^5$ | $10^5$ | $10^5$ |

对全部的测试点,保证:
- $1 \leq n \leq 10^5$
- $0 \leq m \leq n$
- $0 \leq l \leq 10^5$
- 除样例最后一行外,输入字符串的长度不超过 $10$。
- 输入字符串仅含有大小写字母和数字。
- 本周的题解审核志愿者用户名互不相同。
- 本周退出工作的志愿者用户名互不相同,且均是本周的题解审核志愿者。
- 下周将参与工作的志愿者用户名互不相同,且均不是本周的题解审核志愿者。



我的代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int n, m, l;
string yu, leave, join;
int main(){
        cin >> n >> m >> l;
        for(int i=1;i<=n;i++){
                cin >> yu;
        }
        for(int i=1;i<=m;i++){
                cin >> leave;
        }
        for(int i=1;i<=l;i++){
                cin >> join;
        }
        for(int i=1;i<=n;i++){
                bool k = 1;
                for(int j=1;j<=m;j++){
                        if(yu == leave){
                                k = 0;
                        }
                }
                if(k){
                        cout << yu << endl;
                }
        }
        for(int i=1;i<=l;i++){
                cout << join << endl;
        }
}

但提交后不正确

isdkz 发表于 2023-8-13 12:51:30

问题出在你的代码中没有按照题目要求的输出格式进行输出。题目要求按照字典序从小到大的顺序输出下周所有题解审核志愿者的用户名,而你的代码只是按照输入的顺序输出了结果。

为了解决这个问题,你需要对输出结果进行排序。你可以将所有的用户名存储在一个数组中,然后使用C++的sort函数对数组进行排序,最后按照排序后的顺序输出结果。

修改后的代码如下:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int n, m, l;
string yu, leave, join;

int main(){
    cin >> n >> m >> l;
    for(int i=1;i<=n;i++){
      cin >> yu[ i];
    }
    for(int i=1;i<=m;i++){
      cin >> leave[ i];
    }
    for(int i=1;i<=l;i++){
      cin >> join[ i];
    }

    // 将所有用户名存储在一个数组中
    string allUsers;
    int index = 0;
    for(int i=1;i<=n;i++){
      bool k = true;
      for(int j=1;j<=m;j++){
            if(yu[ i] == leave){
                k = false;
                break;
            }
      }
      if(k){
            allUsers = yu[ i];
      }
    }
    for(int i=1;i<=l;i++){
      allUsers = join[ i];
    }

    // 对数组进行排序
    sort(allUsers, allUsers + index);

    // 按照字典序从小到大的顺序输出结果
    for(int i=0;i<index;i++){
      cout << allUsers[ i] << endl;
    }
    return 0;
}


希望对你有帮助!如果还有其他问题,请随时提问。

陶远航 发表于 2023-8-13 12:51:48

你的代码存在一些问题。首先,在输入部分,你使用了 cin 进行输入,并且在字符串数组的大小上做了限制(10002)。然而,根据题目描述,题解审核志愿者数量 $n$ 和新人数量 $l$ 可能会很大,大于你定义的数组大小。因此,你需要使用动态数组而不是固定大小的数组。

其次,在输出部分,你没有按照题目要求的字典序从小到大的顺序输出下周所有题解审核志愿者的用户名。你可以使用 sort 函数对用户名进行排序,然后再输出。

以下是修正后的代码:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    int n, m, l;
    cin >> n >> m >> l;

    vector<string> yu(n), leave(m), join(l);

    for (int i = 0; i < n; i++) {
      cin >> yu[ i];
    }

    for (int i = 0; i < m; i++) {
      cin >> leave[ i];
    }

    for (int i = 0; i < l; i++) {
      cin >> join[ i];
    }

    sort(yu.begin(), yu.end());

    for (int i = 0; i < n; i++) {
      if (find(leave.begin(), leave.end(), yu[ i]) == leave.end()) {
            cout << yu[ i] << endl;
      }
    }

    sort(join.begin(), join.end());
    for (int i = 0; i < l; i++) {
      cout << join[ i] << endl;
    }

    return 0;
}


这样,你的代码就可以正确输出题目要求的结果了。
如果问题已经解决,请设置最佳答案

学习编程中的Ben 发表于 2023-8-13 12:54:09

isdkz 发表于 2023-8-13 12:51
问题出在你的代码中没有按照题目要求的输出格式进行输出。题目要求按照字典序从小到大的顺序输出下周所有题 ...

不对啊

sfqxx 发表于 2023-8-13 13:06:05

确实要sort,他不是说要按字典序排吗?你自己去排

学习编程中的Ben 发表于 2023-8-13 13:07:43

sfqxx 发表于 2023-8-13 13:06
确实要sort,他不是说要按字典序排吗?你自己去排

我解决了,但有一个超时了!!!

sfqxx 发表于 2023-8-13 13:11:55

学习编程中的Ben 发表于 2023-8-13 13:07
我解决了,但有一个超时了!!!

用scanf,printf

学习编程中的Ben 发表于 2023-8-13 13:12:43

sfqxx 发表于 2023-8-13 13:11
用scanf,printf

行,我试试

sfqxx 发表于 2023-8-13 13:13:24

学习编程中的Ben 发表于 2023-8-13 13:12
行,我试试

学习编程中的Ben 发表于 2023-8-13 13:13:40

sfqxx 发表于 2023-8-13 13:11
用scanf,printf

啊啊啊啊啊,不会用

sfqxx 发表于 2023-8-13 13:14:52

本帖最后由 sfqxx 于 2023-9-3 11:43 编辑

cin >> n >> m >> l;

scanf("%d%d%d,"&n,&m,&l)

呃好像不对

sfqxx 发表于 2023-9-3 11:43:38

好啊,不给我最佳,以后不回答了
页: [1]
查看完整版本: c++问题求助