鱼C论坛

 找回密码
 立即注册
查看: 1476|回复: 11

[已解决]c++问题求助

[复制链接]
发表于 2023-8-13 12:50:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# 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$。
- 输入字符串仅含有大小写字母和数字。
- 本周的题解审核志愿者用户名互不相同。
- 本周退出工作的志愿者用户名互不相同,且均是本周的题解审核志愿者。
- 下周将参与工作的志愿者用户名互不相同,且均不是本周的题解审核志愿者。



我的代码:
  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. using namespace std;
  5. int n, m, l;
  6. string yu[10002], leave[10002], join[10002];
  7. int main(){
  8.         cin >> n >> m >> l;
  9.         for(int i=1;i<=n;i++){
  10.                 cin >> yu[i];
  11.         }
  12.         for(int i=1;i<=m;i++){
  13.                 cin >> leave[i];
  14.         }
  15.         for(int i=1;i<=l;i++){
  16.                 cin >> join[i];
  17.         }
  18.         for(int i=1;i<=n;i++){
  19.                 bool k = 1;
  20.                 for(int j=1;j<=m;j++){
  21.                         if(yu[i] == leave[j]){
  22.                                 k = 0;
  23.                         }
  24.                 }
  25.                 if(k){
  26.                         cout << yu[i] << endl;
  27.                 }
  28.         }
  29.         for(int i=1;i<=l;i++){
  30.                 cout << join[i] << endl;
  31.         }
  32. }
复制代码


但提交后不正确
最佳答案
2023-8-13 12:51:30
问题出在你的代码中没有按照题目要求的输出格式进行输出。题目要求按照字典序从小到大的顺序输出下周所有题解审核志愿者的用户名,而你的代码只是按照输入的顺序输出了结果。

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

修改后的代码如下:

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. using namespace std;

  5. int n, m, l;
  6. string yu[10002], leave[10002], join[10002];

  7. int main(){
  8.     cin >> n >> m >> l;
  9.     for(int i=1;i<=n;i++){
  10.         cin >> yu[ i];
  11.     }
  12.     for(int i=1;i<=m;i++){
  13.         cin >> leave[ i];
  14.     }
  15.     for(int i=1;i<=l;i++){
  16.         cin >> join[ i];
  17.     }

  18.     // 将所有用户名存储在一个数组中
  19.     string allUsers[100000];
  20.     int index = 0;
  21.     for(int i=1;i<=n;i++){
  22.         bool k = true;
  23.         for(int j=1;j<=m;j++){
  24.             if(yu[ i] == leave[j]){
  25.                 k = false;
  26.                 break;
  27.             }
  28.         }
  29.         if(k){
  30.             allUsers[index++] = yu[ i];
  31.         }
  32.     }
  33.     for(int i=1;i<=l;i++){
  34.         allUsers[index++] = join[ i];
  35.     }

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

  38.     // 按照字典序从小到大的顺序输出结果
  39.     for(int i=0;i<index;i++){
  40.         cout << allUsers[ i] << endl;
  41.     }
  42.     return 0;
  43. }
复制代码


希望对你有帮助!如果还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-8-13 12:51:30 | 显示全部楼层    本楼为最佳答案   
问题出在你的代码中没有按照题目要求的输出格式进行输出。题目要求按照字典序从小到大的顺序输出下周所有题解审核志愿者的用户名,而你的代码只是按照输入的顺序输出了结果。

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

修改后的代码如下:

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. using namespace std;

  5. int n, m, l;
  6. string yu[10002], leave[10002], join[10002];

  7. int main(){
  8.     cin >> n >> m >> l;
  9.     for(int i=1;i<=n;i++){
  10.         cin >> yu[ i];
  11.     }
  12.     for(int i=1;i<=m;i++){
  13.         cin >> leave[ i];
  14.     }
  15.     for(int i=1;i<=l;i++){
  16.         cin >> join[ i];
  17.     }

  18.     // 将所有用户名存储在一个数组中
  19.     string allUsers[100000];
  20.     int index = 0;
  21.     for(int i=1;i<=n;i++){
  22.         bool k = true;
  23.         for(int j=1;j<=m;j++){
  24.             if(yu[ i] == leave[j]){
  25.                 k = false;
  26.                 break;
  27.             }
  28.         }
  29.         if(k){
  30.             allUsers[index++] = yu[ i];
  31.         }
  32.     }
  33.     for(int i=1;i<=l;i++){
  34.         allUsers[index++] = join[ i];
  35.     }

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

  38.     // 按照字典序从小到大的顺序输出结果
  39.     for(int i=0;i<index;i++){
  40.         cout << allUsers[ i] << endl;
  41.     }
  42.     return 0;
  43. }
复制代码


希望对你有帮助!如果还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

以下是修正后的代码:

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;

  6. int main() {
  7.     int n, m, l;
  8.     cin >> n >> m >> l;

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

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

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

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

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

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

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

  29.     return 0;
  30. }
复制代码


这样,你的代码就可以正确输出题目要求的结果了。
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不对啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 13:06:05 | 显示全部楼层
确实要sort,他不是说要按字典序排吗?你自己去排
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-13 13:07:43 | 显示全部楼层
sfqxx 发表于 2023-8-13 13:06
确实要sort,他不是说要按字典序排吗?你自己去排


我解决了,但有一个超时了!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 13:11:55 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-13 13:07
我解决了,但有一个超时了!!!

用scanf,printf
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-13 13:12:43 | 显示全部楼层

行,我试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 13:13:24 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-13 13:13:40 | 显示全部楼层

啊啊啊啊啊,不会用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 13:14:52 | 显示全部楼层
本帖最后由 sfqxx 于 2023-9-3 11:43 编辑
  1. cin >> n >> m >> l;
复制代码

  1. scanf("%d%d%d,"&n,&m,&l)
复制代码


呃好像不对
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-3 11:43:38 | 显示全部楼层
好啊,不给我最佳,以后不回答了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 00:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表