P1042 乒乓球(模拟 细节 坑爹)

题目链接: P1042 乒乓球

题解: 输入一个判断一个,累计W 和 L 的数据,11制要保证在有人达到11分的情况下两者分差大于等于2才行;21分制一样;即可以这样写:(两种都对)

		if((W >= 11 && W - L >= 2) || (L >= 11 && L - W >= 2))
        if((W >= 11 || L >= 11) && abs(W - L) >= 2)

进入后if后将二者清零,继续后续累计;关键点:最后比分若为0 :0也得输出;

坑爹的点:
  • 输出时可以cin,也可以getchar,但是一定要注意空格处理,我就是getchar然后直接判断:
	if(s == 'W') W++, w++;
    else L++, l++;

这样就是错的,L和l已经把空格也计算进去了,哭!!!!;应该用两个if;

  • 最后若为0 : 0 也得输出,题目并没有说,但的确得输出。。。。血与泪的尝试后发现的!!!
  • 保存结果的数组要开大,不然又会出问题,血与泪的尝试后发现的!!!。。。每行25,2500行,大概11制下结果最多也要有5000多组吧,我开的3000的数组,。。哭!!!
参考代码: 坑爹题!!!
#include 
#include 
#include 
#include 
using namespace std;

char s;
int W, L, w, l, i, j;
int a[10000], b[10000], c[10000], d[10000];

int main()
{
    while((s = getchar()) != 'E')
    //while(cin >> s && s != 'E')
    {
        if(s == 'W') W++, w++;
        //else L++, l++;
        if(s == 'L') L++, l++;

        //if((W >= 11 && W - L >= 2) || (L >= 11 && L - W >= 2))
        if((W >= 11 || L >= 11) && abs(W - L) >= 2)
        {
            a[i] = W; b[i] = L;
            W = 0; L = 0; i++;
        }
        if((w >= 21 || l >= 21) && abs(w - l) >= 2)
        //if((w >= 21 && w - l >= 2) || (l >= 21 && l - w >= 2))
        {
            c[j] = w; d[j] = l;
            w = l = 0; j++;
        }
    }

//    if(W||L) a[i] = W, b[i] = L, i++;
//    if(w||l) c[j] = w, d[j] = l, j++;

    for(int k = 0; k < i; k++) cout << a[k] <<":"<< b[k] << endl;
    cout << W <<":"<< L << endl;
    cout << endl;
    for(int k = 0; k < j; k++) cout << c[k] <<":"<< d[k] << endl;
    cout << w <<":"<< l << endl;
    return 0;
}

你可能感兴趣的:(洛谷,算法与数据结构)