思路
将所有的数据用数组保存下来再进行判断
错误的代码
第一次尝试
#include<iostream>
#include<math.h>//错误点三:注意头文件是math.h
using namespace std;
struct apple {
int lost = 0, all=0;
}a[1000000];
int main() {
int n, m;
int ans1 = 0, ans3 = 0;
int ans2=0;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i].all;
for (int j = 1; j <= m; j++) {
int lost_part;
cin >> lost_part;
a[i].all += lost_part;
a[i].lost += lost_part;
}
ans1 += a[i].all;
}
for (int k = 1; k <= n; k++) {
if (a[k-1].lost > a[k ].lost) ans2 = k; //错误点一:出现k+1>3的情况
}
ans3 =abs( a[ans2].lost);//错误点二:注意题目要求的是输出绝对值
cout << ans1 << " " << ans2 << " " << ans3;
return 0;
}
不清楚为什么错了。
第二次尝试
#include<iostream>
#include<math.h>
using namespace std;
#define N 10000
int main() {
int n, m;
int a[N] = { 0 }, b[N] = { 0 };
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
for (int j = 1; j <= m; j++) {
int lost;
cin >> lost;
b[i] += lost;
}
a[i] = a[i] + b[i];
}
int ans1 = 0, ans2 = 0;
for (int k = 1; k <= n; k++) {
ans1 += a[k];
if (b[k - 1] > b[k]) ans2 = k;
}
cout << ans1 << " " << ans2 << " " << abs(b[ans2]);
return 0;
}
这个代码只给了20分。
新的思路
我们不需要记录所有的数据,只需要寻找符合要求的数据。
第三次失败
#include<iostream>
using namespace std;
int main() {
int m,n;
cin>>n>>m;
int ans1=0,ans2=0,ans3=0;
for(int i=1;i<=n;i++) {
int sum;//每棵树上总共的剩余苹果
cin>>sum;
int lost,lost_all=0;
for(int j=1;j<=m;j++) {
cin>>lost;
lost_all+=lost;
}//每棵树总共损失的苹果
sum=sum+lost_all;
ans1+=sum;
lost_all=-lost_all;
if(ans2<=lost_all){//容易忽略如果一个苹果也没有落下来 大错特错,小于ans3
ans3=lost_all;
ans2=i;//此时不是i-1了
}
}
cout<<ans1<<" "<<ans2<<" "<<ans3;
return 0;
}
错误代码
改为ans3后只能得到60分
除掉=后正确。
正确的代码
#include<iostream>
using namespace std;
int main() {
int m,n;
cin>>n>>m;
int ans1=0,ans2=0,ans3=0;
for(int i=1;i<=n;i++) {
int sum;//每棵树上总共的剩余苹果
cin>>sum;
int lost,lost_all=0;
for(int j=1;j<=m;j++) {
cin>>lost;
lost_all+=lost;
}//每棵树总共损失的苹果
sum=sum+lost_all;
ans1+=sum;
lost_all=-lost_all;
if(ans3<lost_all){//容易忽略如果一个苹果也没有落下来 大错特错,小于ans3
ans3=lost_all;
ans2=i;//此时不是i-1了
}
}
cout<<ans1<<" "<<ans2<<" "<<ans3;
return 0;
}
总结
这道题目不难。错在以下几点:
1、没有写明各个变量的含义,从而出现错误。
2、遇见多类型得·就考虑数组,实际上数组用着不方便,若为同种类型数据,则使用两个数组就可以了。
3、以后要把每块代码得功能以及变量含义写在纸上。
第二天开始做又错了
#include<iostream>
using namespace std;
int main() {
int n=0,m=0,ans1=0,ans2=0,ans3=0;
cin>>n>>m;
int sum=0,lost_all=0,lost=0;
for(int i=1;i<=n;i++) {
cin>>sum;
for(int j=1;j<=m;j++) {
cin>>lost;
lost_all+=lost;
}//计算每颗果树总共落下的果子,值为负数
lost_all=-lost_all;
sum-=lost_all;
ans1+=sum;
if(ans3<lost_all) {
ans2=i;
ans3=lost_all;
}
}
cout<<ans1<<" "<<ans2<<" "<<ans3;
return 0;
}
//解决方案:将lost_all的每一次赋值在循环内。变量的赋值在循环内。
错误原因:
1、lost_all在每一次运算中没有归零。
收获:
1、在有循环结构中,注意每一次循环的开始,定义的值否是自己想要的。
正确的做法
#include<iostream>
using namespace std;
int main() {
int n,m,ans1=0,ans2=0,ans3=0;
cin>>n>>m;
int sum,lost;
for(int i=1;i<=n;i++) {
cin>>sum;
int lost_all=0;
for(int j=1;j<=m;j++) {
cin>>lost;
lost_all+=lost;
}//计算每颗果树总共落下的果子,值为负数
lost_all=-lost_all;
sum-=lost_all;
ans1+=sum;
if(ans3<lost_all) {
ans2=i;
ans3=lost_all;
}
}
cout<<ans1<<" "<<ans2<<" "<<ans3;
return 0;
}