蒟蒻刷洛谷(11月7日到11月13日)

写在前面

啥也没干的一周,这个蒟蒻花了一周时间刷洛谷(入门),下面来说一些感悟。

正文

先声明一下,蒟蒻是从C开始学起的所以解法大多都是C语言实现的,除了有些题非得用cout输出,就不得不借用c++的编译环境了(洛谷好像大多数题都是c++)

首先就是烦人的cout,cout在c++中好像非常好用,输出不像C语言一样得用个printf还得输入%d%f啥的cout人家直接自己识别输出格式好吧;

比如这个题;

  • 一个长方形长宽分别是 6cm、9cm,求它的对角线长度(cm)。直接使用 cout 输出。
    题目在这小学数学N和一

学C的我看见这个题直接懵了,cout是啥,然后我到网上查,然后查到了,原文是这么说的

cout 是C++中 ostream 类型的对象,该类被封装在 < iostream > 库中,该库定义的名字都在命名空间 std 中,所以 cout 全称是 std::cout 。

看见这个我直接就把网页关掉了,因为没接触到c++,然后我问学长,学长告诉我你用double就行;经过尝试,好,一个大大的WA映入眼帘,然后我请教了好多学长还有老师,最后得出结论,我们可以直接使用c++编译器,然后用上面调用上面那个头文件,直接用洛谷c++过的。 具体代码如下

#include<stdio.h>#include<iostream>using namespace std;int main(){   cout<<sqrt(6*6+9*9);   return 0;}

简单吧,很简单。除了头文件其实就一行代码;

第二道是入门2的小鱼航程问题,问题是这样的

  • 有一只小鱼,它平日每天游泳 250 公里,周末休息(实行双休日),假设从周 x(1<=x<=7)x(1≤x≤7) 开始算起,过了 n(n<=10^6)天以后,小鱼一共累计游泳了多少公里呢?
    链接插不上,大家自己找吧洛谷入门二P1424

首先看到这个题我想到的是取余,然后WA打消了我的念头,所以还是得老老实实写。
代码如下

#include<stdio.h>int main(){	long long x,n;	scanf("%lld %lld",&x,&n);	unsigned long long sum=0;//这里注意范围//	long i=7-x+1;//	long s=n-i;//	long m=s%7;//	long w=s/7;//	if(m>5)//	{//		if(x==6||x==7)//		{//			sum+=w*5+5;//		}else//			sum+=w*5+5+(6-x);//	}else{//		if(x==6||x==7)//		{//			sum+=w*5+m;//		}else//		 	sum+=w*6+m+(6-x);//	}//	sum*=250;//	printf("%lld",sum);	int i;	for(i=0;i<n;i++)	{		if((x!=6)&&(x!=7))		sum+=250;		if(x==7)		{			x=1;		}else		{			x++;		}	}	printf("%lld",sum);	return 0;}

第三题

  • 由于这个题有图片而且还有些dddd的东西,所以大家自己看吧。                                            链接插不上,大家自己找吧洛谷入门三P1720

这个题我刚开始没看那个题,之际用哪个公式算了半天,然后运行;
样例答案8.00,我的答案8.05
我当时血压就上来了,我就想着题出问题了是不是,运行半天没效果之后我就放弃了,在我关闭页面之后,我一看题目(斐波那契!!!),在一看答案,8.00;
一瞬间我想明白了许多事。我想各位都懂我就直接上代码了

#include<stdio.h>#include<math.h>int main(){	int n;	scanf("%d",&n);	int i;	double sum=0;	double a=0,b=1,t;	for(i=0;i<n;i++)	{		sum=a+b;		a=b;		b=sum;	}	printf("%.2f",a);//记住最后a才是你需要的数	return 0;	}

非常简单的斐波那契数列,我用循环写的,当然dalao可以用函数或者更高级的方法写,但是蒟蒻只能写这样了。(狗头)。

第四题

不知道大家之前有没有听过幻方(反正这个蒟蒻没听过),这道题让我第一次认识它。题目是这样的

  • 幻方是一种很神奇的 N*NN∗N 矩阵:它由数字 1,2,3,⋯⋯,N×N 构成,且每行、每列及两条对角线上的数字之和都相同。

    当 NN 为奇数时,我们可以通过下方法构建一个幻方:

    首先将 11 写在第一行的中间。

    之后,按如下方式从小到大依次填写每个数 K (K=2,3,...,N x N) :

    若 (K-1)(K−1) 在第一行但不在最后一列,则将K填在最后一行, (K-1)(K−1) 所在列的右一列;
    若 (K-1)(K−1) 在最后一列但不在第一行,则将K填在第一列,(K-1)(K−1)所在行的上一行;
    若 (K-1)(K−1) 在第一行最后一列,则将K填在(K-1)(K−1)的正下方;
    若 (K-1)(K−1) 既不在第一行,也不在最后一列,如果(K-1)(K−1)的右上方还未填数,则将 KK 填在(K-1)(K−1)的右上方,否则将 K填在(K-1)(K−1)的正下方。
    现给定N,请按上述方法构造N×N的幻方。
    链接P2615 [NOIP2015 提高组] 神奇的幻方

题很长,但得仔细看
看到这个题刚开始根本没头绪,但能肯定是个二维数组,但是这个二维数组他有规律但不完全有(滑稽)

想了半天最后一看题,人家给了你这么多条件,肯定得用。
然后我就发现

可以通过数组元素找下标,只需要定义第一个数,然后后面的数就直接下标就行了

代码如下

#include<stdio.h>int main(){   int n;   scanf("%d",&n);   int a[n][n];   for(int s=0;s<n;s++)//初始化   {   	for(int w=0;w<n;w++)   	{   		a[s][w]=0;   	}   }   int i=0,j=(n)/2,cnt=1;//i控制行,j控制列,cnt就是数组元素,找到一个增一下   a[i][j]=cnt;   while(cnt<=n*n)//这部分看着题目条件就能写,只不过得注意不要写错,我写错好几次   {   	cnt++;   	if(i==0&&j!=n-1)   	{   		a[n-1][j+1]=cnt;   		i=n-1;j=j+1;   	}else if(i!=0&&j==n-1)   	{   		a[i-1][0]=cnt;   		i=i-1;j=0;   	}else if(i==0&&j==n-1)   	{   		a[i+1][j]=cnt;   		i+=1;   	}else if(i!=0&&j!=n-1)   	{   		if(a[i-1][j+1]==0&&(i-1)>=0&&(j+1)<=n-1)   		{   			a[i-1][j+1]=cnt;   			i=i-1;j=j+1;   		}else{   			a[i+1][j]=cnt;   			i=i+1;   		}   	}   }   for(int s=0;s<n;s++)   {   	for(int w=0;w<n;w++)   	{   		printf("%d ",a[s][w]);   	}printf("\n");   }   return 0;}
  • 最后一题
    给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和。

  • P2415 集合求和

有一说一刚看到这个题我是懵的,然后我去看了dalao们的题解,最后得到一个结论,我是fw

好了回正题 想解这个题首先你得先知道下面的东西

对于集合每个元素来说,所有子集相加等于集合每个元素相加和的2的n-1次方,n为集合元素个数。

代码如下:

#include<stdio.h>#include<math.h>int main(){	int a[30];	int t;	long long sum=0,l=1;	int i=0;	char s=1;	while(scanf("%d",&t)!=EOF)//这里注意,我第一次想用\n来判断,但是人家根本测试根本不给\n,所以会疯狂TLE	{		//scanf("%d",&t);		//s=getchar();		sum+=t;		i++;	}	sum*=pow(2,i-1);	printf("%lld",sum);	return 0;}

这是蒟蒻第一次写博客,记录一下。

结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值