杭电2103
发布网友
发布时间:2022-04-29 06:40
我来回答
共3个回答
热心网友
时间:2022-06-20 18:27
1)按题目应该是k=10000,而不是1000,在这里因为直接用int计算10000会溢出,所以令k=1,最后打印的时候再加上4个零。
2)整个计算过程都没有用到读入的a的值,即题目中规定可以生的孩子数M。我估计你的
if(i>b)
p=i;
这里,应该是用i>a判断。
3)没有考虑罚款为零的情况,即N小于M且没有生过男孩后在生。所以p的初值修改为b。
4)没有考虑允许生的孩子数是零的情况,即M=0。所以这里将if(i>a)判断往前移。
5)在生的孩子数多于M或者生了男孩后,给p赋值,在需不需要减一上,似乎错了。
以下是在你的基础上改的AC代码
#include<stdio.h>
int main()
{
//freopen("in.txt", "r", stdin);
int a,b,i,k,p,s,t,f[100];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
for(i=1;i<=b;i++)
scanf("%d",&f[i]);
p=b; // 没有违规
for(i=1;i<=b;i++)
{
if(i>a) // 超过了允许生的数量M
{
p=i-1;
break;
}
if(f[i]==1) // 生了一个男孩
{
p=i;
break;
}
/*if(i>b)
p=i;*/
}
s=0;
k=1;
for(i=1;i<=(b-p);i++)
{
s+=k;
k*=2;
}
if (!s)
printf("0 RMB\n");
else
printf("%d0000 RMB\n",s);
}
return 0;
}来自:求助得到的回答
热心网友
时间:2022-06-20 18:28
/*
先给你一组测试数据:
1
2 3
0 0 0
另外你后面不需要多加一行printf("\n");
还有直接用int进行运算可能会溢出
给你一段AC的代码对照着看一下吧
*/
#include<stdio.h>
int main()
{
int T,n,m,a[50],i;
int pow = 1,ans = 0,boy = 0;
scanf("%d",&T);
while(T-- && scanf("%d %d",&n,&m))
{
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<m;i++)
{
if(boy || i >= n){
ans += pow;
pow *= 2;
}
if(a[i] == 1) boy = 1;
}
if(ans == 0)
printf("0 RMB\n");
else printf("%d0000 RMB\n",ans);
}
}
热心网友
时间:2022-06-20 18:28
【题目大意】
国家要实行计划生育,但是为了照顾到某些家庭希望能生个男孩的愿望,所以总统颁布了一条生育法令。给每个家庭一个生育孩子的限额M,就是表示一个家庭最多能生几个孩子,但是如果一旦生了男孩的话,就不能再生了,即使你还没有达到生育的限额。对于违规的家庭,第一次罚10000,第二次就罚20000,第三次就罚40000,以此类推,就是一个等比数列了,之后罚款都是之前的2倍。现在题目给你限额M和每个家庭实际生了几个孩子N,问你这个家庭一共要罚多少钱。
【解题思路】
这道题的话,我是把它分成两段做,实际生孩子的数目在国家允许的范围内为一段,超过的部分分为一段,进行单独处理。另外为了进行判断是否要罚钱了,我定义了一个变量status 来标记该家庭已经生出男孩了。之后生孩子都是违规的,用一个变量NumOfbreak来统计违规次数,最后根据违规次数,计算出总的罚钱数额。这道题因为少考虑了一种情况,通通生女的,并且超过限额,导致WA了一次哦。
#include <stdio.h>
#include <math.h>
int main()
{
int NumOfTest;
int i,j;
int NumOfBaby;
int totalbaby;
int status;
int IsBoy;
int NumOfBreak;
long sum;
/*freopen("e://1.txt","r",stdin);*/
while (scanf("%d",&NumOfTest)!=EOF)
{
for (i=0;i<NumOfTest;i++)
{
status = 0;
sum = 0;
NumOfBreak = 0;
scanf("%d%d",&NumOfBaby,&totalbaby);
for (j=1;j<=totalbaby;j++)
{
scanf("%d",&IsBoy);
if (j<=NumOfBaby)
{
if(IsBoy)
{
if (!status)
{
NumOfBreak=-1;
status = 1;
}
}
}
else
{
if (IsBoy)
{
status=1;
}
}
if (status||j>NumOfBaby)
{
NumOfBreak++;
}
}
if (NumOfBreak==-1||NumOfBreak==0)
{
printf("0 RMB/n");
}
else
{
sum = pow(2,NumOfBreak)-1;
printf("%d0000 RMB/n",sum);
}
}
}
return 0;
}
望采纳哦~ 有问题再问哦~ o(∩_∩)o