写在前面
啥也没干的一周,这个蒟蒻花了一周时间刷洛谷(入门),下面来说一些感悟。
正文
先声明一下,蒟蒻是从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),求出此集合所有子集元素之和。
有一说一刚看到这个题我是懵的,然后我去看了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;
}
这是蒟蒻第一次写博客,记录一下。