您的位置:首页 > 其它

51nod《拉勾专业算法能力测评》测试有感

2018-03-14 23:10 295 查看
昨天在逛博客的过程中,发现一个有趣的网站,也就是51nod,在那里有很多算法马拉松,网站看起来也不错,至于题目的难度也是有一点的。
在逛的过程中,就发现了这个比赛,就点进去看了看。



看到图片的介绍就想挑战一下,看看自己的水平去到哪了,用了几个小时做了五道题,算是比较慢了,尤其是第一题前段时间已经做过的情况下,哈哈哈。在做题的过程,发现自己还是容易掉入一些特殊的案例,容易卡在那里。还是需要努力学习啊,在数据结构的题目上还不是很熟悉,在E题还犯了基础数学的错误,以为斜率是正数。。。。。orz

A题:数字1的数量,可以去看我另一篇博客
B题:走格子,需要注意的是,加的时候可能会溢出int数据范围,因此需要用到long long 数据类型,一个个数据加过去,比较最小,记录下来就可以了
C题:扔盘子,这个题目也不难,就是需要注意好边界条件就行了,注意最底部以及最顶部,处理好这两个边界,就容易多了,无非就是比较与判断能不能放而已。
D题:独木舟,先把人的体重排序,先选择最重与最轻的比较,如果小于等于舟的载重量,就两边同时向中间靠,即i++,j--。如果不是也就是说最重的那个人一个人坐舟。即i++,题目已经说,人不会超过舟的载量。
E题:斜率最大,用结构体就ok了,注意用浮点数,还有,斜率可以为0。

A题:

数字1的数量 



李陶冶 (命题人)基准时间限制:1 秒 空间限制:131072 KB 分值: 5给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Input示例
12
Output示例
5


原创源码:#include<stdio.h>
int main()
{
int N,lower=0,higher=0,dang=0;//lower低位,higher高位,dang当前
int wei=1,sum=0;
scanf("%d",&N);
while(N/wei)
{
lower=N-N/wei*wei;
dang=N/wei%10;
higher=N/(wei*10);
switch(dang)
{
case 0:
sum+=higher*wei;
break;
case 1:
sum+=higher*wei+lower+1;
break;
default:
sum+=(higher+1)*wei;
break;
}
wei*=10;
}
printf("%d\n",sum);
return 0;
}

B题:

走格子 



李陶冶 (命题人)基准时间限制:1 秒 空间限制:131072 KB 分值: 5有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格子走出去。机器人有一个初始能量,每个格子对应一个整数A[i],表示这个格子的能量值。如果A[i] > 0,机器人走到这个格子能够获取A[i]个能量,如果A[i] < 0,走到这个格子需要消耗相应的能量,如果机器人的能量 < 0,就无法继续前进了。问机器人最少需要有多少初始能量,才能完成整个旅程。
例如:n = 5。{1,-2,-1,3,4} 最少需要2个初始能量,才能从1号走到5号格子。途中的能量变化如下3 1 0 3 7。Input
第1行:1个数n,表示格子的数量。(1 <= n <= 50000)
第2 - n + 1行:每行1个数A[i],表示格子里的能量值(-1000000000 <= A[i] <= 1000000000)
Output
输出1个数,对应从1走到n最少需要多少初始能量。
Input示例
5
1
-2
-1
3
4
Output示例
2


原创代码:#include<stdio.h>
int main()
{
int i,n,a[50005],t=-1;
long long min=0,temp=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
min=min+a[i];
if(min<temp)
temp=min;
}
if(min<0)
printf("%lld",-temp);
else
printf("0");
return 0;
}

C题:

有一口井,井的高度为N,每隔1个单位它的宽度有变化。现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去)。盘子有几种命运:1、掉到井底。2、被卡住。3、落到别的盘子上方。盘子的高度也是单位高度。给定井的宽度和每个盘子的宽度,求最终落到井内的盘子数量。



如图井和盘子信息如下:井:5 6 4 3 6 2 3盘子:2 3 5 2 4
最终有4个盘子落在井内。本题由 @javaman 翻译。Input
第1行:2个数N, M中间用空格分隔,N为井的深度,M为盘子的数量(1 <= N, M <= 50000)。
第2 - N + 1行,每行1个数,对应井的宽度Wi(1 <= Wi <= 10^9)。
第N + 2 - N + M + 1行,每行1个数,对应盘子的宽度Di(1 <= Di <= 10^9)
Output
输出最终落到井内的盘子数量。
Input示例
7 5
5
6
4
3
6
2
3
2
3
5
2
4
Output示例
4


原创代码:#include<stdio.h>
void f(int n,int m,int a[],int b[])
{
int i,j,t=n,sum=0;//a是井,b是盘子
for(i=0;i<m;i++)
{
for(j=0;j<t;j++)
{
if(b[i]>a[j])
break;
}
if(j>0)
sum++;
t=j-1;
}
printf("%d",sum);
}
int main()
{
int i,n,m,a[50005],b[50005];
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
f(n,m,a,b);
}D题:

独木舟 



曹鹏 (命题人)基准时间限制:1 秒 空间限制:131072 KB 分值: 10n个人,已知每个人体重。独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?
Input
第一行包含两个正整数n (0<n<=10000)和m (0<m<=2000000000),表示人数和独木舟的承重。
接下来n行,每行一个正整数,表示每个人的体重。体重不超过1000000000,并且每个人的体重不超过m。
Output
一行一个整数表示最少需要的独木舟数。
Input示例
3 6
1
2
3
Output示例
2


原创代码:#include<stdio.h>
int main()
{
int n,m,b,t;
int a[10005],sum=0;
int i,j;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
{
t=i;
for(j=i+1;j<n;j++)
{
if(a[t]>a[j])
t=j;
}
if(t!=i)
{
b=a[i];
a[i]=a[t];
a[t]=b;
}
}
i=0;
j=n-1;
while(i<=j)
{
if(a[j]+a[i]<=m)
i++;
j--;
sum++;
}
printf("%d",sum);
}

E题:

斜率最大 



李陶冶 (命题人)基准时间限制:1 秒 空间限制:131072 KB 分值: 20平面上有N个点,任意2个点确定一条直线,求出所有这些直线中,斜率最大的那条直线所通过的两个点。(点的编号为1-N,如果有多条直线斜率相等,则输出所有结果,按照点的X轴坐标排序,正序输出。数据中所有点的X轴坐标均不相等,且点坐标为随机。)Input
第1行,一个数N,N为点的数量。(2 <= N <= 10000)
第2 - N + 1行:具体N个点的坐标,X Y均为整数(-10^9 <= X,Y <= 10^9)
Output
每行2个数,中间用空格分隔。分别是起点编号和终点编号(起点的X轴坐标 < 终点的X轴坐标)
Input示例
5
1 2
6 8
4 4
5 4
2 3
Output示例
4 2


原创代码:#include<stdio.h>
#include<math.h>
struct dian{
int x;
int y;
}a[10005];
struct zuo{
int i;
int j;
}t[10005],xt;
int main()
{
int n,i,j,T=0,temp;
double x,max=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
x=(a[j].y-a[i].y)*1.0/(a[j].x-a[i].x);
if(x>=max)
{
if(x!=max)
T=0;
t[T].i=i;
t[T].j=j;
T++;
max=x;
}
}
}
for(i=0;i<T;i++)
{
if(a[t[i].i].x>a[t[i].j].x)
{
temp=t[i].i;
t[i].i=t[i].j;
t[i].j=temp;
}
}
for(i=0;i<T-1;i++)
{
for(j=i+1;j<T;j++)
{
if(a[t[i].i].x>a[t[j].i].x)
{
xt=t[i];
t[i]=t[j];
t[j]=xt;
}
}
}
for(i=0;i<T;i++)
printf("%d %d\n",t[i].i+1,t[i].j+1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  51nod 算法练习