很疑惑,明明样例都是对的,自己试了输出也没错,但就是0分

P2669 [NOIP2015 普及组] 金币

Kenny_huang @ 2024-02-01 13:21:55

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int r, c, ans;
    int k = 1;
    while((1 + k) * k / 2 < n) k++;
    r = k;
    c = n - r * (r - 1) / 2;
    // cout << r << " " << c << endl;
    for(int i = 1; i <= r - 1; i++) { //计算前r - 1行的和
        ans += i * i;
    }
    for(int i = 1; i <= c; i++) { //从第一列一直加, 每次加r, 直到加到第c列
        ans += r;
    }
    cout << ans << endl;
    return 0;
}

by __Rickysun__ @ 2024-02-01 13:51:47

你的码风太过奇异我没看懂 这是一道纯模拟,非常的简单啊

在此写下我的代码(突然刷到一道原题,就写一下)

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n, jd = 1, sum = 0, i = 0;
    /*
      jd代表每次加的天数
      i代表总天数(等会模拟要用到)
      sum代表总金币数
     */
    cin >> n;//读入天数
    while (i <= n) {//条件:不能超过天数
        i += jd;//把一个阶段的天数全部加上
        sum += (jd * jd);//把一个阶段的金币全部加上
        jd++;//每次增加的天数+1
    }
    jd--;//循环结束后,把多增加天数的减回来,方便等会把金币减回来
    sum = sum - jd * (i - n);//把多增加的金币减回来
    //i比n多几天就减去相应的金币jd*(i-n)
    cout << sum;//输出结果!
    //结束,撒花撒花~
}

by __Rickysun__ @ 2024-02-01 14:01:19

@Mingzhen_Huang


by Kenny_huang @ 2024-02-01 14:17:16

@Rickysun 感谢大佬,可能我的代码没写注释确实很难搞懂hhhh 我的思路画个图就是这样的:

1

2 2

3 3 3

4 4 4 4

5 5 5 5 5

根据输入的天数判断它是在第r行第c列,比如第10天就是对应第四行第四列,则r = 4, c = 4,即最后一个4,然后循环计算前r - 1行,最后在计算第r行从1到c的每个数字就行了

我自己输了很多个数都对了,样例也没问题,但就是爆零,很烦


by __Rickysun__ @ 2024-02-01 14:20:31

@Mingzhen_Huang 等下,我先画个图推下公式


by Kenny_huang @ 2024-02-01 14:45:19

@Rickysun Orz,抱歉耽误你时间了大佬


by __Rickysun__ @ 2024-02-01 14:46:13

@Mingzhen_Huang 我看懂你代码了,但是没发现问题,等我调试一下


by __Rickysun__ @ 2024-02-01 14:54:20

@Mingzhen_Huang 为啥你的代码单独用可以,放到循环里就不行了???我放到循环里调试了一下,发现从975开始就和我的答案不一样了


by __Rickysun__ @ 2024-02-01 14:59:14

另外我优化了下你的代码

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin >> n;
    int c, ans;
    int k = 1;
    while ((1 + k) * k / 2 < n) k++;
    c = n - k * (k - 1) / 2;
    for (int i = 1; i <= k - 1; i++) ans += i * i;
    ans += (k * c);
    cout << ans << endl;
    return 0;
}

by __Rickysun__ @ 2024-02-01 15:02:46

调试代码:

#include<bits/stdc++.h>
using namespace std;
int Mingzhen_Huang(int n) {
    int c, ans;
    int k = 1;
    while ((1 + k) * k / 2 < n) k++;
    c = n - k * (k - 1) / 2;
    for (int i = 1; i <= k - 1; i++) ans += i * i;
    ans += (k * c);
    return ans;
}
int Rickysun(int n) {
    int jd = 1, sum = 0, i = 0;
    while (i <= n) {
        i += jd;
        sum = sum + jd * jd;
        jd++;
    }
    jd--;
    sum = sum - jd * (i - n);
    return sum;
}
int main() {
    for (int n = 1; n <= 10000; n++) {
        int x = Rickysun(n), y = Mingzhen_Huang(n);
        if (x == y) printf("the same\n");
        else printf("%d:我的答案:%d 你的答案:%d\n", n, x, y);
    }
    return 0;
    //我觉得没啥问题呀,你自己看看
}

by __Rickysun__ @ 2024-02-01 15:03:09

@Mingzhen_Huang


| 下一页