鱼C论坛

 找回密码
 立即注册
查看: 846|回复: 10

[已解决]乒乓球 求解

[复制链接]
发表于 2023-8-16 07:38:11 | 显示全部楼层 |阅读模式

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

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

x
https://www.luogu.com.cn/problem/P1042

  1. #include <iostream>
  2. #include<cmath>

  3. using namespace std;

  4. char a[2509];

  5. void ping(int num)
  6. {
  7.        
  8.        
  9.         int w=0;
  10.         int l=0;
  11.        
  12.         for (int i=0;a[i]!='\0';i++)
  13.         {
  14.                 if(a[i] == 'W')w++;
  15.                 if(a[i] == 'L')l++;
  16.                
  17.                 if ((w>=num || l>=num) && abs(w-l)>=2)
  18.                 {

  19.                         cout << w << ":" << l << endl;
  20.                         w=0;
  21.                         l=0;

  22.                 }

  23.         }
  24.        
  25.         if ((w>=0) || (l>=0))cout << w << ":" << l << endl;
  26.        
  27.        
  28. }


  29. int main()
  30. {
  31.         char n;
  32.         int i=0;
  33.        
  34.         while (cin>>n&&n!='E')
  35.         {

  36.                 if(n=='W'||n=='L')
  37.                 {
  38.                         a[i] = n;
  39.                         i++;
  40.                 }
  41.                
  42.         }
  43.        
  44.         ping(11);
  45.         cout << endl;
  46.         ping(21);


  47.        

  48. }
复制代码



求解测试点4,5,6,7 RE
最佳答案
2023-8-16 19:40:54
  1. #include<iostream>
  2. #include<cmath>
  3. #include<algorithm>
  4. using namespace std;
  5. int f[2] = {11, 21};
  6. int a[25 * 2500 + 10], n = 0; char tmp;
  7. int main() {
  8.     while(1) {
  9.         cin >> tmp;
  10.         if(tmp == 'E') break;
  11.         else if(tmp == 'W') a[n++] = 1;
  12.         else if(tmp == 'L') a[n++] = 0;
  13.     }
  14.     for(int k = 0; k < 2; k++){
  15.         int w = 0, l = 0;
  16.         for(int i = 0; i < n; i++ ){
  17.             w += a[i]; l += 1 - a[i];
  18.             if((max(w, l) >= f[k]) && abs(w - l) >= 2){
  19.                 cout << w << ":" << l << endl; w = l = 0;
  20.             }
  21.         }
  22.         cout << w << ":" << l << endl;
  23.         cout << endl;
  24.     }
  25.     return 0;
  26. }
复制代码

评分

参与人数 1荣誉 +4 贡献 +3 收起 理由
陶远航 + 4 + 3 资深1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-16 07:38:47 | 显示全部楼层
在给出的代码中,出现RE错误可能是因为数组越界访问导致的。具体来说,代码中定义的字符数组 a 的大小为2509,但是在读取输入字符时,没有对数组的大小进行限制,可能会导致数组越界。

为了解决这个问题,可以在读取输入字符时,添加对数组大小的限制,确保不会越界访问。可以修改代码如下:

  1. #include <iostream>
  2. #include <cmath>

  3. using namespace std;

  4. char a[2509];

  5. void ping(int num)
  6. {
  7.     int w = 0;
  8.     int l = 0;

  9.     for (int i = 0; i < 2509 && a[ i] != '\0'; i++) {
  10.         if (a[ i] == 'W')
  11.             w++;
  12.         if (a[ i] == 'L')
  13.             l++;

  14.         if ((w >= num || l >= num) && abs(w - l) >= 2) {
  15.             cout << w << ":" << l << endl;
  16.             w = 0;
  17.             l = 0;
  18.         }
  19.     }

  20.     if (w >= 0 || l >= 0)
  21.         cout << w << ":" << l << endl;
  22. }

  23. int main()
  24. {
  25.     char n;
  26.     int i = 0;

  27.     while (cin >> n && n != 'E') {
  28.         if (n == 'W' || n == 'L') {
  29.             a[ i] = n;
  30.             i++;
  31.         }
  32.     }

  33.     ping(11);
  34.     cout << endl;
  35.     ping(21);

  36.     return 0;
  37. }
复制代码


这样修改后的代码会在读取输入字符时,限制数组大小不超过2509,避免越界访问导致RE错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-16 07:39:38 | 显示全部楼层

评分

参与人数 1贡献 +3 收起 理由
陶远航 + 3 剩下的给小号

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-16 11:41:56 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-16 11:42:21 | 显示全部楼层
我这题得了80
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-16 11:50:58 | 显示全部楼层

我对比了一下题解,跟一个人的思路很想,但是就是找不出为啥RE了@zhangjinxuan @学习编程中的Ben
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-16 11:52:54 | 显示全部楼层
Mike_python小 发表于 2023-8-16 11:50
我对比了一下题解,跟一个人的思路很想,但是就是找不出为啥RE了@zhangjinxuan @学习编程中的Ben

MLE 是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-16 11:54:32 | 显示全部楼层
Mike_python小 发表于 2023-8-16 11:50
我对比了一下题解,跟一个人的思路很想,但是就是找不出为啥RE了@zhangjinxuan @学习编程中的Ben

屏幕截图 2023-08-16 115307.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-16 19:40:54 | 显示全部楼层    本楼为最佳答案   
  1. #include<iostream>
  2. #include<cmath>
  3. #include<algorithm>
  4. using namespace std;
  5. int f[2] = {11, 21};
  6. int a[25 * 2500 + 10], n = 0; char tmp;
  7. int main() {
  8.     while(1) {
  9.         cin >> tmp;
  10.         if(tmp == 'E') break;
  11.         else if(tmp == 'W') a[n++] = 1;
  12.         else if(tmp == 'L') a[n++] = 0;
  13.     }
  14.     for(int k = 0; k < 2; k++){
  15.         int w = 0, l = 0;
  16.         for(int i = 0; i < n; i++ ){
  17.             w += a[i]; l += 1 - a[i];
  18.             if((max(w, l) >= f[k]) && abs(w - l) >= 2){
  19.                 cout << w << ":" << l << endl; w = l = 0;
  20.             }
  21.         }
  22.         cout << w << ":" << l << endl;
  23.         cout << endl;
  24.     }
  25.     return 0;
  26. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-16 19:43:03 | 显示全部楼层
数组开到
  1. 25 * 2501 + 10
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-17 18:45:49 | 显示全部楼层
re就是数组开小了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 19:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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