问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言算法优化

发布网友 发布时间:2022-04-27 00:14

我来回答

1个回答

热心网友 时间:2022-05-21 13:43

【算法描述】
转某牛人的解题报告!!!!
这道题在没看数据规模之前以为是一道简单的DP,但是数据开到十亿,无论在时间还是空间复杂度都过大,所以就要进行优化了。

解一:
简单方法:预期得分30。简单动态规划,f[i]代表青蛙跳到i点时所可能踩到的最少石子数,所以有f[i]=min{f[k]+map[i]}(i-s≤k≤i-t),其中map[i]代表i上是否有石子,有是1,否则0。算法复杂度O(n^2)。

解二:
改进方法:预期得分100。我们会发现,虽然桥很长,但上面最多只有100个石子,想到能否用石子DP,而应该是不行的。那能否基于第一种方法?由于石子排布非常的疏,我们还会发现,如果两个石子相隔甚远,那他们中间的f[i]大部分将会是同一个数,能否把两个石子的距离缩短,使之还与原来等效?要是行的话怎么缩?王乃岩同学考试时做了一个方法能够过全部数据,用的滚动数组存储,下面列出了他的程序。我自己也写了个程序,和他不尽相同:我令L=stone[i]-stone[i-1](stone[i]代表按坐标由小到大顺序排列的石块坐标),当L能够被t整除时(L%t==0),令k=t;当L不能被t整除时(L%t!=0),令k=L%t。然后令k为k+t,最后判断如果k>L,那么map[]数组中stone[i]和stone[i-1]两石头的距离就被等效成为L(也就是没变);如果k<=L,那么map[]数组中stone[i]和stone[i-1]两石头的距离就被等效成为k,可以看出来,这样处理完,两石子最大间距为2*t,大大的缩短了数组,再按解一进行DP,就可以通过了。

#include <stdio.h>
#include <string.h>
long stone[101];
int map[100001];
int f[100001];
long L;
int S, T, M;
void quickSort(int l, int r)
{
int i , j;
long temp;
i = l;
j = r;
temp = stone[i];
while (i < j)
{
while (i < j && stone[j] > temp)
j--;
if (i < j)
{
stone[i] = stone[j];
i++;
}
while (i < j && stone[i] < temp)
i++;
if (i < j)
{
stone[j] = stone[i];
j--;
}
}
stone[i] = temp;
if (i - 1 > l) quickSort(l, i - 1);
if (i + 1 < r) quickSort(i + 1, r);
}
int main()
{
int i, j;
long l, k, p = 0, min;
scanf("%ld%d%d%d", &L, &S, &T, &M);
for (i = 1; i <= M; i++)
scanf("%ld", &stone[i]);
memset(map, 0, sizeof(int)*100001);
memset(f, 0, sizeof(int)*100001);
quickSort(1, M);
stone[0] = 0;
p = 0;
for (i = 1; i <= M; i++)
{
l = stone[i] - stone[i - 1];
if (l % T == 0)
k = T;
else
k = l % T;
k = k + T;
if (l < k)
k = l;
p = p + k;
map[p] = 1;
}
for (i = 1; i <= p + T; i++)
{
min = 1000;
for (j = i - T; j <= i - S; j++)
if ( j >= 0 && f[j] < min)
min = f[j];
f[i] = min + map[i];
}
min = 1000;
for (i = p + 1; i <= p + T; i++)
if (f[i] < min)
min = f[i];
printf("%d\n", min);
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
脚崴了挂什么科、急急急 linux 解压缩工具--tar命令 生日祝福语闺蜜 简短独特暖心 QQ有哪些隐藏的图标??他们分别是什么??怎么样点亮?? QQ业务的各种图标怎么点亮? qq怎么点亮图标和名字 诗中书万象=求下联 大爱如山藏万象下联 中国电子展:电位器和可调电阻的区别是什么?这四点很明显 电位器的接线方法是什么 电位器的工作原理如何 发动机连杆小头铜套损坏会导致什么结果 【50分】c语言程序优化 发动机连杆轻微变形症状 如果C语言函数参数太多,可以怎么优化 连杆轴瓦坏了的现象 c语言如何优化代码不占cpu 汽车连杆活塞坏了怎么办 如何进行C盘手动优化? 如何优化C++程序代码编写 五菱宏光小连杆咚咚异响 几种C语言优化代码技巧 汽车前稳定杆连接杆坏了会怎么样 这个C语言程序怎么优化比较好? 奥迪a6前横向稳定杆小连杆坏了什么症状 梦见老公半夜抱被子回家 梦见老公抱着一口钟回家 梦见老公在外抱一堆茐回家 长春长生生物科技股份有限公司怎么样? 长生生物疫苗案致市值蒸发多少亿? 孕妇梦见老公把好多尸体抱回家 C/C++代码在实时程序设计中是怎么优化的? 汽车悬挂出故障如何看出 C语言小程序优化 连杆弯曲和扭曲后会导致发动机什么原因 C中用什么方法进行效率优化 摩托车曲轴损坏都什么症状 c语言优化,有满意答案给100分 怎么判断平衡轴坏了? C程序优化 发动机轻微拉缸有何现象? 怎么样对我的C:/盘进行手动的优化 c语言怎样优化代码减少占用ram 牛皮席子粘怎么办 搽来搽去 还是粘 如何提高C语言代码效率 夏天躺在凉席上怎么才能不粘身子 如何优化C代码ARMCC问题,怎么解决 被子和凉席为什么黏黏的怎么办 藤席为什么粘身 网贷,信用卡逾期,准备强制上岸,即将被暴通讯录 提前发朋友圈通知通讯录好友 我该怎么说? 夏天用藤席,睡着会粘身么?什么样的凉席比较凉快,价位不要太高。