csp练题记录(C语言,编译器dev c++)201909-1小明种苹果
一、 题目描述
二、思路分析
开始时纠结于|aij|<=10^6到底什么意思,看了博客后知道这是一个对输入数据规模的控制。我们可以把输入的疏果数看成是一个表,表内元素的值即aij的值有规定。开始还误认为是说的表的规模,设了a[1000][1002]的数组,着实憨憨。。。这个可以不予考虑,数据类型直接设为int就够了(水平不够,深入不了-_-#)。
后来找到了dalao的博客看了(文后链接),发现这道题没必要对输入的数据进行一一存储,把数据看作水流的话我们没必要建坝把水给屯起来(题目也没要求),直接记一下水位什么的特征(题中的T,k,p)就好了。
输入接收N:总苹果棵树,M:进行几轮疏果操作。
对疏果操作后所有苹果树上剩余的所有苹果总数T:就是除了N、M外所有接收数据的代数和。
对于p、k,它俩都是被疏果最多的那棵苹果树的具有的值。
p:疏果最多的苹果树的总疏果数,从输入来看,它就是第i行输入的M+1个数中第2~第M+1个数,共M个数之和。
k:疏果最多苹果树的编号,显然,找到p,k也就找到了。
三、代码
问题代码:(用数组存了输入数据,运行有问题,不知道咋改,望dalao们不吝赐教)
#include<stdio.h>
int apples[1000][1000]={0};
int pick[1000]={0};
int tree[1000]={0};
int main()
{
int N,M;
scanf("%d %d",&N,&M);
int T=0,k,p;
int i,j;
//输入初始苹果树及统计疏果操作总数(负数)
for(i=0;i<N;i++)
{
scanf("%d",&tree[i]);
for(j=0;j<M;j++)
{
scanf("%d",&apples[i][j]);
pick[i]=apples[i][j]+pick[i];
}
}
//
p=pick[0];
k=1;
for(i=0;i<N;i++)
{
if(pick[i]>p)
{
p=pick[i];
k=i+1;
}
}
for(i=0;i<N;i++)
{
T=tree[i]+pick[i];
}
p=-pick[k-1];
printf("%d %d %d",T,k,p);
return 0;
}
三、2 正确代码
#include<stdio.h>
int main()
{
int N,M;
int T,k,p=0;
int apples;
scanf("%d%d",&N,&M);
int i,j,pick=0;
//输入过程中已将疏果后总数进行累加,存为T
//在第i行输入中,共有M+1个数,每一棵苹果树疏果总数为后M个数累加之和
for(i=0;i<N;i++)
{
for(j=0;j<M+1;j++)
{
scanf("%d",&apples);
T+=apples;
if(j!=0)
{
pick=pick-apples;//pick=pick+apples;
}
}
if(pick>p)//if(pick<p)
{
p=pick;
k=i+1;
}
pick=0;
}
printf("%d %d %d",T,k,p);//printf("%d %d %d,T,k,-p");
return 0;
}
注意到p的来源是非正的,所以//注释内有另一种写法。
四、参考博客
(https://blog.csdn.net/tigerisland45/article/details/103231149)
ps:个人编程能力极弱,欢迎大家友好批评交流(◦˙▽˙◦)!