小白编程 | CCF CSP201909-1小明种苹果(思路分析)

CCF CSP201909-1小明种苹果(思路分析)

纠错:QQ1002726595

接下来提供两种写法,思路是差不多的。

解法1

  1. 输入所需参数
  2. 一次性计算出苹果剩余数
  3. 通过对比疏果数是否比上一个记录的最大值大来确定最大值,同时记录下标

AC代码

#include

using namespace std;

int main(){
	int N,M,appleNum,cut,count=0,total=0,i,j,max=0,k=0; 
	//N:苹果树总数  M:疏果个数  appleNum:苹果个数  
	//cut:疏果数  count:每一轮的疏果数  max:记录的最大疏果数 k:相应疏果数
	scanf("%d %d",&N,&M);
	for(i = 0; i < N; i ++){ //i=0开始表示第1棵树 
		scanf("%d",&appleNum);
		for (j = 0; j < M; j ++){
		scanf("%d",&cut);
			count += abs(cut);  //记录这棵树疏果总数
		}
		if(count > max){ //如果count大于之前记录的最大数,记录下k:第几棵树,max为count 
			max = count;
			k = i+1;
		}
		total = total + appleNum - count;   //求苹果总数
		count = 0;
	}
	printf("%d %d %d",total,k,max);
	return 0;
}

解法2(map)

具体思路和解法1相同,只是在记录最大数这一步利用了map中insert方法中当遇到重复key时自动忽略的本质,此处将疏果数作为key,将下标作为value保存。

AC代码

#include

using namespace std;

std::map<int,int,greater<int> > m;

int main(){
	int N,M,appleNum,cut,count=0,total=0,i,j; 
	//N:苹果树总数  M:疏果个数  appleNum:苹果个数  
	//cut:疏果数 total:所有苹果树的苹果总数
	scanf("%d %d",&N,&M);
	for(i = 0; i < N; i ++){ //i=0开始表示第1棵树 
		scanf("%d",&appleNum);
		for (j = 0; j < M; j ++){
			scanf("%d",&cut);
			count += abs(cut);
		}
		m.insert(std::pair<int,int>(count,i));  //map遇到相同键值插入自动忽略 
		total = total + appleNum - count;
		count = 0;
	}
	map<int,int>::iterator it = m.begin();  //迭代器
	printf("%d %d %d",total,it->second + 1,it->first);
	return 0;
}

解法2比解法1代码长度、时间使用、空间使用都占用的更多。

你可能感兴趣的:(CSP)