openjudge1.1-1.10错题整理

发布时间 2023-10-08 21:43:58作者: snowycat1234

openjudge1.1-1.10错题整理

我是个傻子 故复制的时候出错或者输出格式出错或者ce将不被收录在此文档中

1.1

OpenJudge - 04:输出保留3位小数的浮点数

Wrong answer

#include<iostream>
int main(){            
    double d;
    scanf("%f",&d);
    printf("%.3f",d);
    return 0;
}

只能说题目让输入单精度就老老实实单精度吧

OpenJudge - 09:字符菱形

给定一个字符,用它构造一个对角线长5个字符,倾斜放置的菱形。

Wrong answer

#include<iostream>

int main(){
    printf(
        "  *\n ***\n*****\n ***\n  *"
    );
}

我真是sb 题目让输入一个c 我给写死了


1.2

OpenJudge - 06:浮点数向零舍入

Wrong answer

#include<bits/stdc++.h>
using namespace std;
int main(){
    float i;

    cin >> i;

    printf("%d",i);
    return 0;
}

%d输出浮点数真的跟强转不一样直接爆0了(物理

所以以后格式化就别瞎用了吧


1.3

OpenJudge - 05:计算分数的浮点数值

Wrong answer

#include <bits/stdc++.h>

int main(){
    float a,b;
    scanf("%d %d",&a,&b);
    printf("%.9lf",a/b);
}

就是说 保留9位的浮点数还是别指望float了

OpenJudge - 19:A*B问题

输入两个正整数A和B,求A*B。

输入

一行,包含两个正整数A和B,中间用单个空格隔开。1 <= A,B <= 50000

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d", a * b);
    return 0;
}

以后记着点不能只看输入范围 还要预估一下结果范围


1.4

OpenJudge - 02:输出绝对值

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    float n;
    scanf("%f", &n);
    if (n >= 0) {
        printf("%.2f", n);
    } else {
        printf("%.2f", -n);
    }
    return 0;
}

错因:当n=0.0时,-n的结果为-0.0

警钟撅烂!!!在浮点数中 0有正负之分!!!

OpenJudge - 04:奇偶ASCII值判断

Wrong answer

任意输入一个字符,判断其ASCII是否是奇数,若是,输出YES,否则,输出NO

#include <bits/stdc++.h>
using namespace std;

int main() {
    char n;
    scanf("%c", &n);
    printf(n % 2 == 0 ? "YES" : "NO");
    return 0;
}

我是朵拉 输出反了

OpenJudge - 09:判断能否被3,5,7整除

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    int x;
    scanf("%d", &x);
    int count = 0;
    if (x % 3 == 0) {
        printf("3");
        count ++;
    }
    if (x % 5 == 0) {
        if (count != 0) {
            printf(" ");
        }
        printf("5");
        count ++;
    }
    if (x % 7 == 0) {
        if (count != 0) {
            printf(" ");
        }
        printf("7");
    }
    if (count == 0)
        printf("n");
    return 0;
}

警钟撅烂!!! if注意加else 当心多重输出!!

OpenJudge - 20:求一元二次方程的根

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    float a, b, c;
    scanf("%f %f %f", &a, &b, &c);
    double delta = b * b - 4 * a * c;
    if (delta > 0) {
        double x1 = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
        double x2 = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);
        printf("x1=%.5f;x2=%.5f"
               , max(x1, x2)
               , min(x1, x2));
    } else if (delta == 0) {
        printf("x1=x2=%.5f",  -b / 2 * a);
    } else {
        double r = b == 0 ? 0 : -b / (2 * a);
        double i = sqrt(4 * a * c - b * b) / (2 * abs(a));
        printf("x1=%.5f+%.5fi;x2=%.5f-%.5fi"
               , r, i
               , r, i);
    }
    return 0;
}

注意看\(\Delta=0\)时2 * a没打括号 运算优先级错了


1.5

OpenJudge - 30:含k个3的数

Wrong answer

#include <bits/stdc++.h>
using namespace std;


int main() {
    int t, k, res = 0, exp;
    scanf("%d %d", &k, &exp);
    if ( k % 19 != 0) {
        printf("NO");
        return 0;
    }
    while (k > 0) {
        t = k % 10;
        k = k / 10;
        if (t == 3) {
            res ++;
            if (res > exp) {
                printf("NO");
                return 0;
            }
        }
    }

    if (res == exp) {
        printf("YES");
        return 0;
    }
    return 0;
}

没考虑全.假如最后res < exp的话,那就啥输出也没有了.

OpenJudge - 32:求分数序列和

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, p = 1, q = 2;
    double res;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++) {
        res += (double)q / p;
        q = p + q;
        p = q - p;
    }
    printf("%.4f", res);
    return 0;
}

res没赋初值.我怀疑openjudge测评机上默认内存初始值全是0xff


1.6

OpenJudge - 01:与指定数字相同的数的个数

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, k, count;
    scanf("%d", &n);
    int arr[n];
    memset(arr, 0, sizeof arr);
    for (int i = 0; i < n; i ++) {
        scanf("%d", arr + i);
    }
    scanf("%d", &k);
    for (int i = 0; i < n; i ++) {
        if (arr[i] == k)
            count ++;
    }
    printf("%d", count);

    return 0;
}

count又没赋初始值.屡教不改是吧

OpenJudge - 03:计算书费

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n = 10, k;
    float res = 0, arr[] = {28.9, 32.7, 45.6, 78, 35, 86.2, 27.8, 43, 56, 65};
    for (int i = 0; i < n; i ++) {
        scanf("%d", &k);
        cout << k << endl;
        res += arr[i] * k;
    }
    printf("%.1f", res);

    return 0;
}

res又没赋初值...相似

赋初值赋初值赋初值赋初值赋初值赋初值赋初值赋初值

OpenJudge - 10:大整数加法

Wrong answer

#include <bits/stdc++.h>
using namespace std;

typedef struct number {
    int *arr;//from low to high
    int length;
} BigNumber;

int getNum(BigNumber &a, int index) {
    if (index > a.length) {
        return 0;
    } else {
        return a.arr[index];
    }
}
void freePrefix0(BigNumber &b){
    for(int i = b.length;i > 0;i --){
        if(b.arr[i] == 0){
//            free((int *)b.arr + i);
            b.length--;
        }else break;
    }
}
BigNumber newInstance(string s,int len) {
    BigNumber res = {
            (int *)calloc(1,(len + 1) * 4),
            len
    };
    for (int i = 0; i < res.length; i ++) {
        res.arr[res.length - i] = s[i] - '0';
    }
    return res;
}

void print(BigNumber b) {
    for(int i = b.length;i > 0;i --){
        printf("%d",b.arr[i]);
    }
}

BigNumber add(BigNumber a, BigNumber b) {
    int add = 0, len = max(a.length, b.length) + 1, sum;
    BigNumber res = {
            (int *)calloc(1,(len + 1) * 4),
            len
    };
    for (int i = 1; i <= len; i ++) {
        sum = getNum(a, i) + getNum(b, i) + add;
        add = sum / 10;
        res.arr[i] = sum % 10;
    }
    freePrefix0(res);
    return res;
}


int main() {
    string s1,s2;
    cin >> s1 >> s2;
    BigNumber num = newInstance(s1,s1.length());
    BigNumber num1 = newInstance(s2,s2.length());
    BigNumber num2 = add(num, num1);
    print(num2);
    return 0;
}

高精度计算.....算法题要来了

freePrefix0()里面删除前导0当b所代表值为0时会把所有0删掉......也就是说会输出空串.

未通过的测试点

0
0

幸好后面几道高精度都一次ac了不用写题解


1.7

OpenJudge - 01:统计数字字符个数

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    string str;
    cin >> str;
    int count  = 0;
    for (int i = 0; i < str.length(); i ++) {
        if (str[i] >= '0' && str[i] <= '9') {
            count ++;
        }
    }
    printf("%d", count);
    return 0;
}

字符串输入问题.cin的左移操作符会读入到' ''\n',而不确保读入整行.

OpenJudge - 02:找第一个只出现一次的字符

Wrong answer

给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int arr[26];
    memset(arr, 0, sizeof arr);
    string str;
    getline(cin, str);
    for (int i = 0; i < str.length(); i ++) {
        arr[str[i] - 'a'] ++;
    }
    for (int i = 0; i <= 26; i ++) {
        if (i == 26) {
            printf("no");
            return 0;
        } else if (arr[i] == 1) {
            printf("%c", i + 'a');
            return 0;
        }
    }
}
    return 0;
}

是按照**第一个,不是按ASCII第一个啊啊啊啊啊

OpenJudge - 10:简单密码

Wrong answer

#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-8;

int main() {
    string str;
    getline(cin, str);

    for (int i = 0; i < str.length(); i ++) {
        char c = str[i];
        if (c >= 'A' && c < 'Z') {
            str[i] -= 5;
            if (str[i] < 'A')
                str[i] += 26;
        }
    }

    printf("%s", str.c_str());

    return 0;
}

好家伙,管\(A\)不管\(Z\)是吧

OpenJudge - 11:潜伏者

Wrong answer

每个字母只对应一个唯一的“密字”,不同的字母对应不同的“密字”。“密字”可以和原字母相同。

#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-8;

int main() {
    string str1, str2, sec;
    getline(cin, str1);
    getline(cin, str2);
    getline(cin, sec);
    char arr[26];
    memset(arr, 0, sizeof arr);
    for (int i = 0; i < str1.length(); i ++) {
        char c = str1[i];
        if (arr[c - 'A'] != str2[i] && arr[c - 'A'] != 0) {
            printf("Failed");
            return 0;
        }
        arr[c - 'A'] = str2[i];
    }
    for (int i = 0 ; i < 26; i ++) {
        if (arr[i] == 0) {
            printf("Failed");
            return 0;
        }
    }
    for (int i = 0; i < sec.length(); i ++) {
        sec[i] = arr[sec[i] - 'A'];
    }
    cout << sec;

    return 0;
}

我是盲人.忘了查每个字符对应密字不同了

OpenJudge - 19:字符串移位包含问题

Wrong answer

给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串。

#include <bits/stdc++.h>

using namespace std;

int kmpmatch(string str, string patt) {
    if (str.length() < patt.length() || patt.length() == 0)
        return -1;
    int next[patt.length()];
    int i = 0, j = 0;
    next[i] = 0;
    for (i = 1; i < patt.length(); i ++) {
        while (true) {
            if (patt[i] == patt[j]) {
                j ++;
                next[i] = j;
                break;
            } else {
                if (j == 0) {
                    next[i] = 0;
                    break;
                } else {
                    j = next[j - 1];
                }
            }
        }
    }
    i = 0, j = 0;
    for (; j < patt.length(); i ++) {
        if (i == str.length())
            return -1;
        if (str[i] == patt[j]) {
            j ++;
        } else if (j > 0) {
            i --;
            j = next[j - 1];
        }
    }
    return i - j;
}

bool contains(string s1, string s2) {
    return kmpmatch(s1, s2) != -1;
}

int main() {
    string s1, s2;
    cin >> s1 >> s2;
    char arr[s1.length() * 2 - 1];
    for (int i = 0; i < s1.length(); i ++) {
        arr[i] = s1[i];
    }
    for (int i = 0; i < s1.length() - 1; i ++) {
        arr[i + s1.length()] = s1[i];
    }
    for (int i = 0; i < s1.length(); i ++) {
        if (contains(string(arr + i, s1.length()), s2)) {
            printf("true");
            return 0;
        }
    }
    printf("false");
    return 0;
}

s1s2是轮换对称的......也就是说s1包含s2或者s2包含s1都可以.再次重申我是盲人.

OpenJudge - 20:删除单词后缀

Wrong answer

#include <bits/stdc++.h>

using namespace std;

int kmpmatch(string str, string patt) {
    if (str.length() < patt.length() || patt.length() == 0)
        return -1;
    int next[patt.length()];
    int i = 0, j = 0;
    next[i] = 0;
    for (i = 1; i < patt.length(); i ++) {
        while (true) {
            if (patt[i] == patt[j]) {
                j ++;
                next[i] = j;
                break;
            } else {
                if (j == 0) {
                    next[i] = 0;
                    break;
                } else {
                    j = next[j - 1];
                }
            }
        }
    }
    i = 0, j = 0;
    for (; j < patt.length(); i ++) {
        if (i == str.length())
            return -1;
        if (str[i] == patt[j]) {
            j ++;
        } else if (j > 0) {
            i --;
            j = next[j - 1];
        }
    }
    return i - j;
}

bool contains(string s1, string s2) {
    return kmpmatch(s1, s2) != -1;
}

int main() {
    char str[33];
    scanf("%s", str);
    int len = 0;
    for (; str[len] != '\0'; len ++) {}
    if (len < 3) {
        printf("%s", str);
        return 0;
    }

    if (kmpmatch(string(str), "er") == len - 2) {
        printf("%s", string(str, len - 2).c_str());
        return 0;
    }

    if (kmpmatch(string(str), "ly") == len - 2) {
        printf("%s", string(str, len - 2).c_str());
        return 0;
    }
    if (len < 4) {
        printf("%s", str);
        return 0;
    }

    if (kmpmatch(string(str), "ing") == len - 3) {
        printf("%s", string(str, len - 3).c_str());
        return 0;
    }
    printf("%s", str);
    return 0;
}

本代码中kmpmatch()匹配的是从左至右第一个字串的位置.故当str="referer"时,匹配到第一个"er",导致判断有误.我猜测此题可以使用string::rfind().

OpenJudge - 22:紧急措施

Presentation Error

#include <bits/stdc++.h>
using namespace std;

bool equalsTo(string& str1,string& str2){
    if(str1.length()!=str2.length())return false;
    for(int i = 0;i < str1.length();i ++){
        if(str1[i] != str2[i])return false;
    }
    return true;
}
void ope(string &str){
    for(int i = 0;i < str.length();i ++){
        char c = str[i];
        if(c >= 'a'&&c <= 'z'){
            str[i] += 'A' - 'a';
        }else if(c >= 'A'&&c <= 'Z'){
            str[i] -= 'A' - 'a';
        }
    }
}
int main() {
    string email,name,e,pwd;
    int n,count = 0;
    cin >> email;
    scanf("%d",&n);
    for(int i = 0;i < n;i ++){
        cin >> name >> pwd >> e;
        if(equalsTo(email,e)){
            count ++;
            ope(pwd);
            if(count != 0)printf("%c",'\n');
            cout << name << " " << pwd;
        }
    }
    if(count == 0)printf("empty");
    return 0;
}

还没输出呢就count++.可不是多个\n

OpenJudge - 25:最长最短单词

Wrong answer

#include <bits/stdc++.h>
using namespace std;
string str, w1, w2;


int main() {
    getline(cin, str);
    int maxl = 0, minl = 101;
    string max, min;
    int last = -1;
    int i = 0;
    for (i = 0; i < str.length(); i ++) {
        if (str[i] == ' ' || str[i] == ',') {
            if (i - last - 1 > maxl) {
                maxl = i - last - 1;
                max = string(str, last + 1, i - last - 1);
            }
            if (i - last - 1 < minl) {
                minl = i - last - 1;
                min = string(str, last + 1, i - last - 1);
            }
            last = i;
        }
    }
    if (i - last - 1 > maxl) {
        maxl = i - last - 1;
        max = string(str, last + 1, i - last - 1);
    }
    if (i - last - 1 < minl) {
        minl = i - last - 1;
        min = string(str, last + 1, i - last - 1);
    }
    cout << max << endl << min;
}

没照顾到中间可能有连续多个空格情况.当有此类情况时,输出短单词为"".

OpenJudge - 27:单词翻转

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    string str;
    int last = -1;
    getline(cin,str);
    int i = 0;
    for(;i < str.length();i ++){
        if(str[i] == ' '){
            for(int j = last + 1;j < (last + i) / 2;j ++){
                char t = str[j];
                str[j] = str[i - (j - last)];
                str[i - (j - last)] = t;
            }
            last = i;
        }
    }
    for(int j = last + 1;j < (last + i) / 2;j ++){
        char t = str[j];
        str[j] = str[i - (j - last)];
        str[i - (j - last)] = t;
    }
    cout << str;
    return 0;
}

好好好,翻转算法写错了.

字符串翻转中轴线

如图所见,由于整除是直接抛弃小数部分,那对于正数来说,就是向下取整.那如果

j < (last + i) / 2的话,当待翻转字符串长度为偶数时,就会漏掉翻转中间一对字符,导致结果错误.

出现错误的样例:

输入

abcd

输出

dbca

OpenJudge - 29:ISBN号码

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    int arr[9], t;
    scanf("%1d-%1d%1d%1d-%1d%1d%1d%1d%1d-%1d",
          arr, arr + 1, arr + 2, arr + 3, arr + 4, arr + 5, arr + 6, arr + 7, arr + 8, &t);
    int count = 0;
    for (int i = 0; i < 9; i ++) {
        count += (i + 1) * arr[i];
    }
    count %= 11;
    if (count == t) {
        printf("Right");
    } else {
        printf("%d-%d%d%d-%d%d%d%d%d-%c",
               arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8], count == 10 ? 'X' : (count + '0'));
    }
    return 0;
}

忽略了输入最后一位是'X'的情况而%d无法输入该数据.

OpenJudge - 35:字符串的展开

Wrong answer

#include<bits/stdc++.h>
using namespace std;
string in;
int p1,p2,p3;
void replaceLetter(char left,char right){
    printf("%c",left);
    if(p3 == 1){
        for(char c = left + 1;c < right;c ++){
            printf("%s",string(p2,p1 == 1 ? c : (p1 == 2?(c + 'A' - 'a') : '*')).c_str());
        }
    }else{
        for(char c = right - 1;c > left;c --){
            printf("%s",string(p2,p1 == 1 ? c :(p1 == 2? (c + 'A' - 'a') : '*')).c_str());
        }
    }
    printf("%c",right);
}
void replaceNumber(char left,char right){
    printf("%c",left);
    if(p3 == 1){
        for(char c = left + 1;c < right;c ++){
            printf("%s",string(p2,p1 == 3 ? '*' : c).c_str());
        }
    }else{
        for(char c = right - 1;c > left;c --){
            printf("%s",string(p2,p1 == 3 ? '*' : c).c_str());
        }
    }
    printf("%c",right);
}
int main(){
    in.resize(101);
    scanf("%d%d%d\n%s",&p1,&p2,&p3,in.c_str());

    int last = -2,i = 0;
    for(;i < in.length();i ++){
        if(in[i] == '-'){

            if(i != in.length() - 1){
                char l = in[i - 1],r = in[i + 1];
                if(l >= 'a' && l <= 'z' && r >= 'a' && r <= 'z' && l < r){

                    printf("%s",string(in,last + 2,i - last - 3).c_str());
                    replaceLetter(l,r);
                    last = i;
                    i += 2;
                }else if(l >= '0' && l <= '9' && r >= '0' && r <= '9' && l < r){
                    printf("%s",string(in,last + 2,i - last - 3).c_str());
                    replaceNumber(l,r);
                    last = i;
                    i += 2;
                }
            }
        }
    }
    if(last + 2 < in.length())
        printf("%s",string(in,last + 2).c_str());
    return 0;

}

题意理解错误.原题"-"前后的数字或字母是可以复用的.

导致错误的样例:

输入:

1 1 1
a-c-e

错误输出:

abc-e

正确输出:

abcde

1.8

Wrong answer

OpenJudge - 03:计算矩阵边缘元素之和

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, a, b;
    scanf("%d%d", &a, &b);
    int arr[a][b];
    memset(arr, 0, sizeof arr);
    for (int i = 0; i < a; i ++) {
        for (int j = 0; j < b; j ++) {
            scanf("%d", &arr[i][j]);
        }
    }
    int res = 0;
    if (a == 1 && b == 1) {
        res = arr[0][0];
    } else if (a == 1) {
        for (int i = 0; i < b; i ++) {
            res += arr[0][i];
        }
    } else if (b == 1) {
        for (int i = 0; i < a; i ++) {
            res += arr[i][0];
        }
    } else
        for (int i = 0; i < a; i ++) {
            res += arr[i][0];
            res += arr[i][b - 1];
        }
    for (int i = 1; i < b - 1; i ++) {
        res += arr[0][i];
        res += arr[a - 1][i];
    }
    printf("%d", res);
    return 0;
}

一眼就看出来问题了对吧.\(else\)后面\(\{\}\)没了

警钟撅烂!!!if或者else后面一定要想清楚加不加\(\{\}\)!!

OpenJudge - 07:矩阵归零消减序列和

Wrong answer

显然,经过(n-1)次上述过程, n*n的矩阵会被转换为一个1*1的矩阵。

请求出每次消减前位于第二行第二列的元素的值。

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    scanf("%d", &n);
    int arr[n][n];
    memset(arr, 0, sizeof arr);
    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < n; j ++) {
            scanf("%d", &arr[i][j]);
        }
    }
    int count = 0;
    for (; n > 1; n --) {
        if (count != 0) {
            printf("\n");
        }
        count = 1;
        printf("%d", arr[1][1]);
        for (int i = 0; i < n; i ++) {
            int m = arr[i][0];
            for (int j = 1; j < n; j ++) {
                m = min(m, arr[i][j]);
            }
            for (int j = 0; j < n; j ++) {
                arr[i][j] -= m;
            }
        }
        for (int i = 0; i < n; i ++) {
            int m = arr[0][i];
            for (int j = 1; j < n; j ++) {
                m = min(m, arr[j][i]);
            }
            for (int j = 0; j < n; j ++) {
                arr[j][i] -= m;
            }
        }
        for (int i = 1; i < n - 1; i ++) {
            for (int j = 0; j < n; j ++) {
                arr[i][j] = arr[i + 1][j];
            }
        }
        for (int i = 1; i < n - 1; i ++) {
            for (int j = 0; j < n; j ++) {
                arr[j][i] = arr[j][i + 1];
            }
        }
    }
    printf("\n%d", arr[0][0]);
    return 0;
}

这题我的评价是很迷.照这个描述应该输出n - 1行.但是要求输出n行.所以只能猜题意了.不做解释.

OpenJudge - 20:反反复复

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    string str;

    scanf("%d\n", &n);
    getline(cin,str);
    int line = str.length()/n;
    char arr[str.length()/n][n];

    for (int i = 0; i < line; i ++) {
        if(i % 2 == 0) {
            for (int j = 0; j < n; j ++) {
                arr[i][j] = str[i * 5 + j];
            }
        }else{
            for (int j = 0; j < n; j ++) {
                arr[i][n - 1 - j] = str[i * 5 + j];
            }
        }
    }
    for(int i = 0;i < n;i ++){
        for(int j = 0;j < line;j ++)printf("%c",arr[j][i]);
    }




    return 0;
}

写一半忘了n是可以输入的了,我给写死了.看起来我这智力有点低.

OpenJudge - 25:螺旋加密

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int arr[402], ind = 0, res[20][20], l;

void fill(int x, int y, int w, int h) {
    if (w == 0 || h == 0 || ind >= l)
        return;
    if (w == 1) {
        for (int i = 0; i < h; i ++) {
            res[x + i][y] = arr[ind];
            ind ++;
            if (ind >= l)
                return;
        }
    } else if (h == 1) {
        for (int i = 0; i < w; i ++) {
            res[x][y + i] = arr[ind];
            ind ++;
            if (ind >= l)
                return;
        }
    } else {
        for (int i = 0; i < w; i ++) {
            res[x][y + i] = arr[ind];
            ind ++;
            if (ind >= l)
                return;
        }
        for (int i = 1; i < h; i ++) {
            res[x + i][y + w - 1] = arr[ind];
            ind ++;
            if (ind >= l)
                return;
        }
        for (int i = w - 2; i >= 0; i --) {
            res[x + h - 1][y + i] = arr[ind];
            ind ++;
            if (ind >= l)
                return;
        }
        for (int i = h - 2; i > 0; i --) {
            res[x + i][y] = arr[ind];
            ind ++;
            if (ind >= l)
                return;
        }
        fill(x + 1, y + 1, w - 2, h - 2);
    }
}

int main() {
    int n, m = 0;
    string str;
    cin >> n >> m;
    getchar();
    getline(cin, str);
    l = str.length() * 5;
    memset(arr, 0, sizeof arr);
    memset(res, 0, sizeof res);
    int index = 0, len;
    for (len = 0; len < str.length(); len ++) {
        int num;
        if (str[len] == ' ') {
            num = 0;
        } else {
            num = str[len] - 'A' + 1;
        }
        for (int i = 5; i > 0; i --) {
            arr[index] = (num >> (i - 1)) % 2;
            index ++;
        }
    }
    fill(0, 0, m, n);


    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < m; j ++) {
            printf("%d", res[i][j]);
        }
    }


    return 0;
}

res的大小扩大至int[21][21]后可以ac.目前尚不明确其中原理.


1.9

OpenJudge - 04:谁拿了最多奖学金

Wrong answer

2)     五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;

#include <bits/stdc++.h>
using namespace std;

int main() {
    int max = -1, t1, t2, t3, n, sum = 0, mon;
    char t[25];
    memset(t, 0, sizeof(t));
    string name;
    char c1, c2;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++) {
        scanf("%s%d%d %c %c %d", &t, &t1, &t2, &c1, &c2, &t3);
        mon = 0;
        if (t1 > 80 && t3 >= 1)
            mon += 8000;
        if (t1 > 85 && t2 >= 80)
            mon += 4000;
        if (t1 > 90)
            mon += 2000;
        if (t1 > 85 && c2 == 'Y')
            mon += 1000;
        if (t2 > 80 && c1 == 'Y')
            mon += 850;
        sum += mon;
        if (mon > max) {
            max = mon;
            name = string(t);
        }
    }
    printf("%s\n%d\n%d", name.c_str(), max, sum);

    return 0;
}

笑死我了,80取等了.取等条件在oi还能看见

OpenJudge - 09:直方图

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, maxv = 0, arr[10000], t;
    scanf("%d", &n);

    for (int i = 0; i < n; i ++) {
        scanf("%d", &t);
        maxv = max(t, maxv);
        arr[t] ++;
    }
    for (int i = 0; i <= maxv; i ++) {
        if (i != 0)
            printf("\n");
        printf("%d", arr[i]);
    }
    return 0;
}

arr没初始化.

OpenJudge - 14:铺地毯

Wrong answer

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, x, y, res = -1;
    scanf("%d\n", &n);
    int arr[n][4];
    for (int i = 0; i < n; i ++) {
        scanf("%d%d%d%d", &arr[i][0], &arr[i][1], &arr[i][2], &arr[i][3]);
    }
    scanf("%d%d", &x, &y);
    for (int i = 0; i < n; i ++) {
        if (x >= arr[i][0] && x <= arr[i][0] + arr[i][1]
                && y >= arr[i][1] && y <= arr[i][3]) {
            res = i + 1;
        }
    }
    printf("%d", res);
    return 0;
}

笑死我了 下表访问错了 我是sb.这测试样例都能过 我怀疑oj是故意放了这么水一个样例

1.10

OpenJudge - 08:病人排队

Wrong answer

一个长度小于10的字符串表示病人的ID

#include <bits/stdc++.h>
using namespace std;


typedef struct stu {
    int age, ord;
    char id[7];
};


bool compare(stu a, stu b) {
    bool oa = a.age >= 60, ob = b.age >= 60;
    if (oa != ob) {
        return oa;
    } else {
        if (oa) {
            if (a.age != b.age) {
                return a.age > b.age;
            } else {
                return a.ord < b.ord;
            }
        } else {
            return a.ord < b.ord;
        }
    }
}

int main() {
    int n;
    scanf("%d", &n);
    stu arr[n], t;
    for (int i = 0; i < n; i ++) {
        t = stu();
        t.ord = i;
        memset(t.id, 0, sizeof t.id);
        scanf("%s%d", t.id, &t.age);
        arr[i] = t;
    }
    sort(arr, arr + n, compare);
    for (int i = 0; i < n; i ++) {
        if (i != 0)
            printf("\n");
        printf("%s", arr[i].id);
    }
    return 0;
}

这个name数组开小了。。。不知道为什么测试样例的name长度都是7。。

OpenJudge - 10:单词排序

Runtime Error

#include <bits/stdc++.h>
using namespace std;

int main() {
    string words[200];
    string line;
    getline(cin, line);
    int index, count;
    for (;;) {
        index = line.find(" ");
        if (index == -1) {
            words[count] = line;
            count ++;
            break;
        }
        if (index != 0) {
            words[count] = line.substr(0, index);
            count ++;
        }
        if (index != line.length() - 1) {
            line = line.substr(index + 1);
        } else {
            break;
        }
    }
    sort(words, words + count);
    string last;
    for (int i = 0; i < count; i ++) {
        if (words[i] != last) {
            if (i != 0) {
                printf("\n");
            }
            printf("%s", words[i].c_str());
            last = words[i];
        }
    }


    return 0;
}

index = line.find(" ")替换为index = line == "" ? -1 : line.find(" ")后可以ac.也就是说,line在一定情况中可能为"",但目前尚不明确其中原理.