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