导航:首页 > 源码编译 > oj算法猜数字

oj算法猜数字

发布时间:2022-06-01 17:16:16

① 杭电acm1007

我看了你的代码,但是有些地方不懂,不过可以知道的是,你不知道题目猜数字其实就是用二分法进行猜,不是你一次if就能计算出结果的。要用for循环或者用对数进行计算。
参考代码AC:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,t,s,i,m;
while(cin>>n)
{
t=1;
s=0;
m=n;
for(i=1;n>t;i++){//其实就是一棵树
s+=i*t;
n-=t;
t*=2;
}
s+=n*i;
printf("%.2lf\n",(double)1.0*s/m);
}
return 0;
}

② OJ贪心算法,活动安排,求大神解答

按结束时间从小到大排序,之后从开始贪心即可

③ 求python三位水仙花数OJ题和答案

print(str([iforiinrange(100,1000)if(i%10)**3+(i//10%10)**3+(i//100)**3==i])[1:-1])

一行代码带走

如果不想要最后的换行,则用下面这句

print(str([iforiinrange(100,1000)if(i%10)**3+(i//10%10)**3+(i//100)**3==i])[1:-1],end='')

④ 求教两道杭电OJ上的ACM题,贪心算法的

两个问题有共同的地方就是他们都要个排序的标准啊
1789的标准是扣分的多少
而2037的标准是节目上演时间的长短
排序之后再进行从最优的选择开始进行挑选(挑完后做个标记)避免重复 一下是我的程序
(我也是初学者 写的不太好请谅解)
1789
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int main(void)
{
int n,m,temp,sum,i,j,h,x;
int su [1009];
int su1[1009];
int su2[1009];
while(cin>>n)
{
while(n--)
{
sum=0;
cin>>m;
for(i=1;i<=m;i++)
su[i]=i;
for(i=1;i<=m;i++)
cin>>su1[i];
for(i=1;i<=m;i++)
cin>>su2[i];
for(i=1;i<=m-1;i++)
for(j=i+1;j<=m;j++)
if(su2[i]<su2[j])
{
temp=su1[i];
su1[i]=su1[j];
su1[j]=temp;
temp=su2[i];
su2[i]=su2[j];
su2[j]=temp;
}
for(i=1;i<=m;i++)
{
h=0;
for(x=su1[i];x<=m;x++)
{
if(su[x]==0)
{ h=1;
break;
}
}
if(h==0)
for(j=su1[i];j<=m;j++)
su[j]--;
else
sum+=su2[i];
}
cout<<sum<<endl;
}

}
return 0;
}
2037
#include<iostream>
using namespace std;//根据上演电视剧时间的长短来排序越短越合算
int main(void)
{

int n,i,j,h,x,count,temp;
int su[200];
int su1[200];
int su2[200];
while(cin>>n&&n)
{
count=0;
for(i=1;i<=200;i++)
su[i]=1;
for(i=1;i<=n;i++)
cin>>su1[i]>>su2[i];
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
if((su2[i]-su1[i])>=(su2[j]-su1[j]))
{
temp=su2[i];
su2[i]=su2[j];
su2[j]=temp;
temp=su1[i];
su1[i]=su1[j];
su1[j]=temp;
}

for(i=1;i<=n;i++)
{ h=0;
for(j=su1[i];j<su2[i];j++)
if(su[j]<=0)
{ h=1;
break;
}
if(h==0)
{for(x=su1[i];x<su2[i];x++)
su[x]--;
count++;
}
}
cout<<count<<endl;
}

return 0;
}

⑤ oj最小值 给出一个n个数的数列询间

你是要一个算法吧?
我想了半天,只有一个 O(n^2) 的算法,而且要假设 a[i] 都是正数(如果有正有负就太麻烦了).
这个可以叫动态规划算法,也可以什么都不叫,因为它就是个最简单的动态规划.
总的思路:
r 从 1 到 n,对每个 r,在前 r 个数:a[1],a[2],...,a[r] 中,求:
在所有以 r 结尾的区间 [k,r](其中 k = 1,2,...,r)中,f(k,r) = a[p]*(a[k]+a[k+1]+...+a[r]) 中最大的那个.
这样,总的最大值(即题目所求)就是所有 r 从 1 到 n 中最大的那个.
首先我们造一个辅助序列:S[r] = a[1]+a[2]+...+a[r]
这样对任意的 k,我们就能在 O(1) 时间算出:a[k]+a[k+1]+...+a[r] = S[r] - S[k-1]
然后,对每个 r,定义一个 M 序列:
如果 a[k] 是 a[k],a[k+1],...,a[r] 中的最小值,那么就把 k 放进 M 序列中.
k 也是从右往左依次放入 M 序列,所以 M[1] < M[2] < ...< M[T(r)] = r,其中 T(r) 是 M 序列的长度.
对于 M 中的一个数:M[i],所有以 M[i] 为最小值的序列中,f 值最大的一个是从 M[i-1]+1 到 r 的序列:
a[M[i]] * (a[M[i-1]+1] + a[M[i-1]+2] + ...+ a[r]) = a[M[i]] * (S[r] - S[M[i-1]])
所以,我们只要对每个 M 中的值,都算出:a[M[i]] * (S[r] - S[M[i-1]]),取最大的一个就行了.
当我们从 r 到 r+1 时,需要更新 M 序列.
只需将 a[r+1] 分别与 a[M[T(r)]],a[M[T(r)-1]],...相比,如果 a[r+1] 小,就把旧的 M 序列中的数删掉,最后在 M 序列的末尾添上 r+1 即可.
时间复杂度:
对每个 r,其 M 序列最多有 O(n) 个数,每个 a[M[i]] * (S[r] - S[M[i-1]]) 都可以在 O(1) 时间算出,所以最后是 O(n^2)
关于更多的思考.
能否优化:能,但并不改变 O(n^2) 的时间复杂度.
假设第 r 步时,M[i] 是 f 值最大的那个.
那么在后面的 r+1,r+2,...步时,只要 M[i] 还在 M 序列中,那么 M[i] 的 f 值永远比 M[1],M[2],...,M[i-1] 的 f 值大.
但 M[i] 可能从 M 序列中删掉,这样的话,M[1],M[2],...,M[i-1] 就又可能成为最大的 f 值了.
所以优化是这样:给 M 序列造一个辅助序列 flag,如果 M[i] 曾经取到最大 f 值,那么 flag[i] = 1,否则 flag[i] = 0.
这样我们不需要对所有的 M[i] 计算 f 值,只要(在 M 序列中)从右到左依次计算 M 值,直到碰到第 1 个 flag[i] = 1 的即可.
就说这么多了,如果对哪个细节不清楚,就追问一下吧.

⑥ 杭电acm2178

首先,猜数字是不能乱猜的。肯定要找到一定的方法来猜的!
要猜到最大的数字m,也就是说,在1到m间的每一个数,你都能在n次内把它猜出来!
所以说在最坏的情况下,在1到m间,你最多只要猜log2(m)+1(取整)次,所以m=2^n-1.即猜n次,你能猜到的最大的数为2^n-1.
#include<stdio.h>
int main()
{
int t, n, m;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
m = 1;
while (n--) m <<= 1;
printf("%d\n", m-1);
}
return 0;
}

⑦ oj上的C语言题目,带小数的高精度算法

没必要一定要用小数,用整数来计算,同时统计小数点应该在的位数。
然后输出的时候按字符输出,把点.放在对应的输出位上面。
浮点数总是有误差的,要完全无误差精度的话可能有点问题。
代码的话你自己实现吧,应该还是比较简单的,oj的题目代码还是得自己敲的

⑧ 请教编程高手:如何培养编写算法的思路

选一本出色的教材.有条件就看英文的,然后给自己一个环境,例如LINUX+GCC+GDB,用纯粹的语言去在解决问题的过程中学习算法.
没有目的性去学习,往往效率不高,可以找一些ONLINE JUDGE的题目做做.例如Welcome To PKU JudgeOnline,对着里面的问题,先自己思考,尝试编程解决,如果不能解决,就翻翻算法书,想想为什么.

如果还是不行,那就上网看看别人有没有解决掉,怎么做,看看他们用到什么算法,比对着,然后进一步自己去实现.
有时候对于算法的问题的实现,你在实现之前也许会卡住,但是在编程过程中,随着你的锻炼和熟练度的提高.会有那么一天你觉得什么都通了,而且,你是在用的过程中学习.坚持走下去,一定事半功倍.

“cracking the coding interview”,题目是按照array, stack&queue, 链表,树图,递归这种章节安排的,每章节题目7-8个,不多,难度中等,找感觉很有帮助。第一遍自己写不出来的话(我就是,这么弱!),画图分析,抄背默。一遍做完再做一遍,第二遍就快很多,理解也深刻了,所谓读书百遍,其意自现,算法也一样。

不要一开始就看《算法导论》,这本书有太多关于算法的数学证明.
推荐你看看这本:算法(第4版) (豆瓣),作者是高德纳的学生:塞奇威克 (Robert Sedgewick)
书中算法代码主要是用Java编写,里面有大量的图来让你明白例如:排序,查找,树和图的算法运行过程。
这本书的目录编排也很清晰,他就告诉你算法主要就可以分为:排序,查找,图和字符串。从这4个方面可以演化出很多算法,最关键是:这本书的作者不但是在告诉你what,而且告诉你why(分析各种算法的优缺点)
这本书其他好的地方
比如讲到快速排序,很多书可能讲了快速排序的原理就完了。但这本书就直接讲了原始的快速排序可以改进的地方:1. 在小数组上,切换到插入排序;2. 三取样切分;3. 三向切分的快速排序。
优先队列怎么和排序算法扯上关系呢?其实优先队列就是可以用堆排序来实现,堆排序的时间复杂度和快速排序是一样的,但是实际中为什么堆排序的运行时间要比快速排序多呢?因为这和CPU的Cache命中率有关系,堆排序不符合算法运行的局部性原则
比如书中2.5节,讲了排序算法的实际用途,这本书不光告诉你算法的原理,还告诉你算法的用途。

⑨ oj最简单的题目

注意题目要求从小到大输出

if(a[i]!=a[j])
k++;
if(k==n)
{ a[n]=b[j];
n++;

}
这段代码有问题

给你一组数据,你自己调吧

3 4
5 6 8
4 6 7 8

⑩ 为什么我在OJ上做得水仙花数的题总是wrong answer

楼主,这三个式子错了
a=i/100;
b=i%100/10;
c=i%100%10;

修改如下
#include<stdio.h>
int main()
{
int m,n,i,a,b,c,d=0;
scanf("%d %d",&m,&n);
while(m!=0&&n!=0)
{
if(m>=100&&n<=999)
for(i=m;i<=n;i++)
{
a=i/100;
b=i/10-a*10;
c=i%10;
if(i==a*a*a+b*b*b+c*c*c)
{
printf("%d ",i);d++;
}
}
if(m<n&&d==0)
printf("no\n");
else
printf("\n");
scanf("%d %d",&m,&n);
}
return 0;
}

阅读全文

与oj算法猜数字相关的资料

热点内容
程序员那么可爱小说结局 浏览:862
zenity命令 浏览:564
监禁风暴哪个app有 浏览:865
程序员的爱心是什么 浏览:591
java中对字符串排序 浏览:290
单片机用数模转换生成三角波 浏览:634
外网怎么登陆服务器地址 浏览:133
什么人要懂编译原理 浏览:150
源码改单 浏览:712
pdfzip 浏览:875
压缩空气25兆帕会变成液体吗 浏览:50
linux测试服务器性能 浏览:950
dlp硬盘加密 浏览:361
应用加密里面打不开 浏览:857
基于单片机的超声波测距仪的设计 浏览:741
xp自动备份指定文件夹 浏览:664
我的世界服务器如何让世界平坦 浏览:170
服务器和电脑如何共享 浏览:689
程序员早期症状 浏览:573
学小学生编程哪里学 浏览:951