鱼C论坛

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

[已解决]乒乓球 求解

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

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

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

x
https://www.luogu.com.cn/problem/P1042
#include <iostream>
#include<cmath>

using namespace std;

char a[2509];

void ping(int num)
{
        
        
        int w=0;
        int l=0;
        
        for (int i=0;a[i]!='\0';i++)
        {
                if(a[i] == 'W')w++;
                if(a[i] == 'L')l++;
                
                if ((w>=num || l>=num) && abs(w-l)>=2)
                {

                        cout << w << ":" << l << endl;
                        w=0;
                        l=0;

                }

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


int main()
{
        char n;
        int i=0;
        
        while (cin>>n&&n!='E')
        {

                if(n=='W'||n=='L')
                {
                        a[i] = n;
                        i++;
                }
                
        }
        
        ping(11);
        cout << endl;
        ping(21);


        

}


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

评分

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

查看全部评分

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

使用道具 举报

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

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

using namespace std;

char a[2509];

void ping(int num)
{
    int w = 0;
    int l = 0;

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

        if ((w >= num || l >= num) && abs(w - l) >= 2) {
            cout << w << ":" << l << endl;
            w = 0;
            l = 0;
        }
    }

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

int main()
{
    char n;
    int i = 0;

    while (cin >> n && n != 'E') {
        if (n == 'W' || n == 'L') {
            a[ i] = n;
            i++;
        }
    }

    ping(11);
    cout << endl;
    ping(21);

    return 0;
}

这样修改后的代码会在读取输入字符时,限制数组大小不超过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 | 显示全部楼层    本楼为最佳答案   
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int f[2] = {11, 21};
int a[25 * 2500 + 10], n = 0; char tmp;
int main() {
    while(1) {
        cin >> tmp;
        if(tmp == 'E') break;
        else if(tmp == 'W') a[n++] = 1;
        else if(tmp == 'L') a[n++] = 0;
    }
    for(int k = 0; k < 2; k++){
        int w = 0, l = 0;
        for(int i = 0; i < n; i++ ){
            w += a[i]; l += 1 - a[i];
            if((max(w, l) >= f[k]) && abs(w - l) >= 2){
                cout << w << ":" << l << endl; w = l = 0;
            }
        }
        cout << w << ":" << l << endl;
        cout << endl;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-13 18:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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