第一次错误——20分
#include<iostream>
using namespace std;
int main() {
int n,k,cake=0;
cin>>n>>k;
int a[1005];
int ans=0;
for(int j=1;j<=n;j++) cin>>a[j];
for(int i=1;i<=n;i++) {
cake+=a[i];
if(cake>k) {
ans++;
cake=0;
}
}
cout<<ans;
return 0;
}
忽略了如果蛋糕没有分完时的少一次计数
第二次错误——70分
#include<iostream>
using namespace std;
int main() {
int n,k,cake=0;
cin>>n>>k;
int a[1005];
int ans=0;
for(int j=1;j<=n;j++) cin>>a[j];
for(int i=1;i<=n;i++) {
cake+=a[i];
if(cake>k) {
ans++;
cake=0;
}
if(i==n&&cake<k) ans++;
}
cout<<ans;
return 0;
}
第三次错误——90分
#include<iostream>
using namespace std;
int main() {
int n,k,cake=0;
cin>>n>>k;
int a[1005];
int ans=0;
for(int j=1;j<=n;j++) cin>>a[j];
for(int i=1;i<n;i++) {
cake+=a[i];
if(cake>k) {
ans++;
cake=0;
}
}
ans++;
cout<<ans;
return 0;
}
正确
#include<iostream>
using namespace std;
int main() {
int n,k,cake=0;
cin>>n>>k;
int a[1005];
int ans=0;
for(int j=1;j<=n;j++) cin>>a[j];
for(int i=1;i<n;i++) {
cake+=a[i];
if(cake>=k) {//关键点,忽视了如果可以正好分到K
ans++;
cake=0;
}
}
ans++;
cout<<ans;
return 0;
}
**总结:
- 对于大小关系应该敏感,考虑是否可以相等。
- 对数组开头和末尾情况敏感。
- 拿任意一个分析:如第i块,如果a[i]>k,那么次数加一,盘子清空,如果<k则再加上!由于第a[n]块时,不管大于不大于,都得给人。换句话说前n-1块蛋糕没有约束,不管是否大于小于。
**