小明种苹果(续)
- 切忌在一个循环中干多件事情
- csp不需要什么高超的算法,只要不是python一切好说
题目如下
原本写法
1获取输入
1.1获取输入同时计算最终果数
1.2获取输入同时计算落果数进行落果标记
2计算连续3颗树的落果组数
如图1所示
改进写法
1获取输入
1.1获取输入同时计算最终果数
1.2获取输入同时只进行落果标记
2计算连续3颗树的落果组数
2.1计算组数同时计算落果标记
区别在于:将落果数的计算移到了下方计算!
个人心得:
应当是一个极简单的问题,但是却搞了一下午,也是通过比照满分算法得出的结论,算作是一次教训吧。
另外网上关于算法比赛的代码很难看清楚,其一是没有注释,其二是命名太不规范,所以根据一个程序员的良心或者从业责任心也应当写的清楚明了。
最后附上完整代码:
int treeNum = 0;
cin >> treeNum;
//最终留下的果数
int leftTotalNum = 0;
//落果数
int dropNum = 0;
//3树落果组数
int groupNum = 0;
//根据最大果树数简历的标记落果情况的数组
int dropArray[1000] = {0};
//接收输入
for (int i = 0; i < treeNum; i++)
{
dropArray[i] = 0;
//本行参数数
int num = 0;
cin >> num;
//参数1:苹果起始个数
int thisBegin = 0;
cin >> thisBegin;
//标记苹果先前的剩余量
int previous = thisBegin;
for (int j = 1; j < num; j++)
{
//新的输入量
int newNum = 0;
cin >> newNum;
//大于零表示计数
if (newNum>0) {
//小于先前果数表示落果
if (newNum < previous) {
//防止树重复落果被重复计算
dropArray[i] = 1;
previous = newNum;
}
}
//小于零表示梳果
else {
previous += newNum;
}
}
//一行输入处理完毕将剩余果量归并
leftTotalNum += previous;
}
//利用标记连续落果棵数计算组数
int flag = 0;
//果树指针
int cursor = 0;
//treeNum+2表示果树是环状,有边界条件
for (int i = 0; i < treeNum+2; i++)
{
if (dropArray[cursor] == 1) {
flag++;
//在此处进行落果情况计算
if (i=3) {
groupNum++;
}
cursor++;
//边界条件的处理,需要指针从尾部连接至首部
cursor %= treeNum;
}
cout << leftTotalNum << " " << dropNum << " " << groupNum;