采花生
题目描述:
给定一个矩形的范围,其中埋有花生,问在时间为k的限制中,最多能够采到多少花生,输出花生数;如果采不到,就输出0。
分析:
其实,这就是一道模拟类的题。先找出最大值,然后进行第一次判断,判断采完后能否回去,即判断2*x+1是否大于k,若第一次判断时大于k,则输出0,并且return 0,因为他摘不到花生。若小于,则计数器sum累加当前花生数,并将a[x][y]=0,记录当前的x和y,nowx=x,nowy=y,k减去(x-1)。然后再次执行上述操作,直到k<=0。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int m,n,k,maxx=-1111111,a[100][100];
int time1,time2,sum=0,x,y,nowx,nowy;
void formax()//此处寻找最大值
{
maxx=0;//注意:这条语句必加,否则将找不到第二个最大值
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
if(maxx<a[i][j])
{
maxx=a[i][j];
x=i;//记录下当前的位置
y=j;
}
}
int main()
{
freopen("108.in","r",stdin);
freopen("108.out","w",stdout);
cin>>m>>n>>k;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
formax();
if(2*x+1<=k)//第一次判断,需要进行特殊处理
{
sum+=a[x][y];//累加花生数
a[x][y]=0;
nowx=x;//记录下第一次的位置
nowy=y;
k=k-x-1;//用总时间减去所要采花生的时间及回来的时间
}
else
{
cout<<0<<endl;//如果采不到花生就输出0,结束程序
return 0;
}
while(k>0)
{
time1=abs(nowx-x)+abs(nowy-y);//记录走到第二个点需要的时间
time2=x+1;//记下返回的时间
if(time1+time2>k) break;//判断能否返回
sum=sum+maxx;
a[x][y]=0;
nowx=x;
nowy=y;
k=k-time1-1;
}
cout<<sum<<endl;
return 0;
}
津津的储蓄计划
题目描述:每个月初,妈妈都会给津津300元的零花钱,妈妈提出,可以将整百的钱存在她那里,年末,妈妈会加上20%还给她。所以只要津津预计到这个月剩下的钱超过100元时,她就会把整百的钱给妈妈,剩下的留在自己手里。但是存在妈妈那里的钱不能提前取出,所以就有可能在某个月的月初,津津手上的钱加上妈妈给的钱不过这个月的预计花销。现在请你根据某年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到某年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。如果会,则输出第一个出现这样情况的月份的相反数。
分析:
模拟题,设置一个数组,记录每个月的预计费用,并且设置一个变量,记录津津现在手上的钱,循环,每次都应加上妈妈给的300元然后减去这个月的开支,若减完后为负数,就说明会出现这样的情况,应该输出对应月份的相反数。若减完后所剩大于100,则累加整百的钱数,剩下的钱留下,再进行计算。若12个月后还未出现钱不够的现象,则输出存在妈妈那里的钱的1.2倍。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int s=0,a[100],ans=0;
for(int i=1;i<=12;i++)//读入12个月的预计支出
cin>>a[i];
for(int i=1;i<=12;i++)
{
s=s+300-a[i];//记录现在剩下的钱
if(s<0)//如果剩下的钱小于0,就输出对应月份的相反数
{
cout<<-i<<endl;
return 0;
}
else
{
ans=ans+s/100*100;//记录存在妈妈那的钱的总数
s=s%100;//津津所剩下的钱
}
}
cout<<s+ans*1.2<<endl;//将津津得到的钱加上所剩的钱输出
return 0;
}