洛谷练习记录[10.7]

P1149 火柴棒等式

emmm算是打表吧
搞出了明明把一千以内的对应火柴根数都安排上了,结果数组大小只有100的乌龙,全部RE。
因为n<=24所以暴力点也无妨
有递归标签所以应该是要用递归优化一下的

#include<stdio.h>
int matches[1000]={6,2,5,5,4,5,6,3,7,6};
int n;

int main()
{
	for(int x=1;x<10;x++){
		for(int y=x*10;y<x*10+10;y++){
			matches[y]=matches[x]+matches[y%10];
		}
	}
	for(int x=1;x<10;x++){//百位数从1到9 
		for(int y=x*100;y<x*100+100;y++){//从100数到199...200数到299... 
			matches[y]=matches[x]+matches[y%100/10]+matches[y%10];
		}
	}	
	int sum=0;
	scanf("%d",&n);
	for(int i=0;i<1000;i++){
		for(int j=0;j<1000;j++){
			if(i+j<1000&&matches[i]+matches[j]+matches[i+j]+4==n){
				//printf("%d+%d=%d\n",i,j,i+j);
				sum++;
				}
			}
		}
	//printf("%d\n",matches[711]);
	printf("%d",sum); 
	return 0;
}

19.8.23

P1085 不高兴的津津

#include<stdio.h>
int main()
{
	int school,extra,i,sum,box;
	box=0;
	for(i=1;i<=7;i++){
		scanf("%d %d",&school,&extra);
		sum=school+extra;
		if(sum>8&&box==0)
		box=i;
}
	printf("%d",box);
return 0;
}

P1089 津津的储蓄计划
两个问题:
1.读错题
2.在最后计算中漏掉了手上的余额
3.x是多余的,在修改时加上的,但最终没用上

#include<stdio.h>
int main()
{
	int month,i,budget,surplus,box,mother,x;
	mother=0;
	surplus=0;
	box=0;
	i=0;
	for(month=1;month<=12;month++){
		surplus+=300;
		scanf("%d",&budget);
		if(budget>surplus&&box==0)
			box=month;
			else surplus-=budget;
		if(surplus>=100){
			i=surplus/100*100;
			surplus-=i;
			mother+=i;
		}
	}
	if(box!=0)
	printf("-%d",box);
	else{
		mother*=1.2;
		printf("%d",mother+surplus);
	}

return 0;
}

P1909 买铅笔
两个问题:
1.弄错了输出,一开始写了输出money
2.考虑不周全,原先写法完全忽略了购买总数小于单份包装铅笔数量的情况,导致一部分AC一部分WA……加个数量判断之后让上述情况的购买份数=1,AC。

#include<stdio.h>
int main()
{
	int n,x,p,i,y,money,min;
	min=0;
	scanf("%d",&n);
	for(i=1;i<=3;i++){
		scanf("%d %d",&x,&p);
		if(n>=x){
			if(n%x!=0) y=n/x+1;
			else y=n/x;
		}
		else y=1;
	    money=y*p;
		if(min==0||money<min)
	    min=money;
	}
	printf("%d",min);
return 0;
}

19.8.24

P1008 三连击
1.不知道怎么确保三个三位数的各位数互不相同(或者说能想到的办法中变量太多了)
2.通过这道题熟悉了数组的使用及各位数的求法
3.实际上还是看了题解

#include<stdio.h>
int main()
{
	int i,j,k,n,flag;
	
	for(i=123;i<=329;i++){
	j=i*2;
	k=i*3;
	flag=1;
	int a[10]={0};
	
	a[i/100]++;
	a[(i%100)/10]++;
	a[i%10]++;
	
	a[j/100]++;
	a[(j%100)/10]++;
	a[j%10]++;
	
	a[k/100]++;
	a[(k%100)/10]++;
	a[k%10]++;
	
	for(n=01;n<10;n++)
	if(a[n]!=1)
	flag=0;
	if(flag==1)
	printf("%d %d %d\n",i,j,k);
}
return 0;
}

P1423 小玉在游泳
连浮点数输入输出的写法都没搞明白

scanf("%lf",&a);	//输入
printf("%f",a);		//输出
#include<stdio.h>
int main()
{
	int step,first;
	first=2;
	double x,y,z;	//要游的目标距离,实际游的距离
	y=first;
	z=first;		 
	double i=0.98;
	scanf("%lf",&x);
	for(step=1;y<x;step++){
		z=z*i;
		y+=z;}
	printf("%d",step);
return 0;
}

P1424 小鱼的航程(改进版)
一开始看到n的范围以为用long……?然后一片WA……
改成int之后就AC了
原本想用数组给每一天插旗再遍历累加
然而最后用了纯数学方法,没用上循环……

#include<stdio.h>
int main()
{
	int x,sum,i,j;
	int n,y;//n天,y完整周
	scanf("%d %d",&x,&n);
	i=7-x+1;
	if(x<=5) sum=250*(5-x+1);
	else 	 sum=0;
	y=(n-i)/7;
	sum+=y*5*250;
	j=(n-i)%7;
	if(j>5)  sum+=5*250;
	else	 sum+=j*250;
	printf("%d",sum);
	
return 0;
}

P1980 计数问题
求位数那里应该可以用循环写,毕竟有规律
那么多个if实在是傻了吧唧的
回头再改改

扫描二维码关注公众号,回复: 8743538 查看本文章
#include<stdio.h>
int main()
{
	int n,x,i,sum,flag;
	sum=0;
	scanf("%d %d",&n,&x);
	int a[n+1]={0};
	for(i=1;i<=n;i++){
		flag=9;
		a[i]=i; 
		
		if(a[i]/100000000!=0&&flag==9) flag=8;
		if(a[i]/10000000!=0&&flag==9) flag=7;
		if(a[i]/1000000!=0&&flag==9) flag=6;
		if(a[i]/100000!=0&&flag==9) flag=5;
		if(a[i]/10000!=0&&flag==9) flag=4;
		if(a[i]/1000!=0&&flag==9) flag=3;
		if(a[i]/100!=0&&flag==9) flag=2;
		if(a[i]/10!=0&&flag==9) flag=1;
		if(a[i]/10==0&&flag==9) flag=0;
		
		switch(flag){
			case 8:
				if (a[i]%1000000000/100000000==x) sum++;
			case 7:
				if (a[i]%100000000/10000000==x) sum++;
			case 6:
				if (a[i]%10000000/1000000==x) sum++;
			case 5:
				if (a[i]%1000000/100000==x) sum++;
			case 4:
				if (a[i]%100000/10000==x) sum++;
			case 3:
				if (a[i]%10000/1000==x) sum++;
			case 2:
				if (a[i]%1000/100==x) sum++;
			case 1:
				if (a[i]%100/10==x) sum++;
			case 0:
				if (a[i]%10/1==x) sum++;
		}
	}
	printf("%d",sum);
return 0;
}

19.8.25

P2141 珠心算测验
WA了五六次才……
难点在于算出来的和有没有被“翻过牌”
然后看了题解才知道可以用另一个数组当牌记录
解决这个之后又因为以下原因WA
1.忘记初始化ans
2.忘记输入数据没有按大小依次排列,导致和的检查写成了从被加数后面的数开始
3.把和的检查改成从a[1]开始之后顺手把被加数也改成了从a[1]开始……调试后才发现1+1重复了,而事实上我是按照1+2,1+3,1+4;2+3,2+4;3+4这样来算的

#include <stdio.h>

int main()
{
	int n,i,j,k,ans;
	ans=0;
	scanf("%d",&n);
	int a[n+1],b[n+1];

	for(i=1;i<=n;i++){
		scanf("%d",&a[i]);
		b[i]=2;
	}
	for(i=1;i<=n;i++){
		for(j=i+1;j<=n;j++){
			for(k=1;k<=n;k++){
				if(a[i]!=0&&a[j]!=0&&a[i]+a[j]==a[k]&&b[k]==2) {
				ans++;
				b[k]=1;
			}
			}
		}
	}
	printf("%d",ans);
return 0;
}
发布了28 篇原创文章 · 获赞 0 · 访问量 688

猜你喜欢

转载自blog.csdn.net/weixin_45561591/article/details/100046462