Data Structures and Algorithms (English) - 7-28 Review of Programming Contest Rules(30 分)

简介: Data Structures and Algorithms (English) - 7-28 Review of Programming Contest Rules(30 分)

题目链接:点击打开链接

 

题目大意:按照ACM/ICPC的比赛计分规则(解题数+20分钟罚时规则),给定比赛时间、总题数。


假设某个人是这样做题的:

1. 用一定时间通读所有的题,计算出解出每个题目所需的时间,以及如果错了,调试一次所需的时间。

2. 他一旦开始做某题,不做出来就不换题(一不做二不休)。

3. 对于每道题,他第一次提交的时间决定了他需要调试的次数。


具体地说是这样的:


开始1小时(包括1小时整)内提交一次AC;

第二个小时内提交需要调试一次才能AC;

……

第N个小时内提交需要提交N次才能AC;

问题是要帮他确定一个可以获得尽量高排名的做题顺序:在解题量尽量高的前提下让罚时尽量小。

image.png

Ps:两个样例,把“//”加起来就是答案。

解题思路:


对于N道题规模的暴力搜索的时间复杂度是O(N⋅N!)。


然而题目的规模不大,N≤9,可取。


完全模拟真实比赛进程就可以了,由此可以得到两个基本的搜索出口:比赛时间到、题目全部解出(AK)。


每当到达搜索出口时,要将当前解与当前最优解比较并试图更新(最优解合并),这里需要O(N)的时间。


这个问题呢,仅以N为因子则时间复杂度不可能降低,最优算法即O(N⋅N!),原因是你总是需要生成解题顺序的全排列来计算最优的方案。比如在比赛时长足够长(无限)的情况下,这也是一个有后效性的问题,不存在动态规划解。


AC 代码

#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define ssclr(ss) ss.clear(), ss.str("")#define INF 0x3f3f3f3f#define MOD 1000000007usingnamespacestd;
typedeflonglongll;
constintmaxn=10;
intH, N, T0;
intfin_time, fin_used, fin_num;
// 记录题目完成情况:1,完成 0,未完成  暂存题目标号  最终题目标号  题目完成时间  DEBUG时间intvis[maxn], tid[maxn], id[maxn], T[maxn], D[maxn];
stringname[maxn];
voidinit()
{
mem(vis, 0), mem(tid, 0), mem(id, 0);
fin_num=0;
fin_time=INT_MAX;
}
voidupdate(intnum, inttme)
{
// 优先选择做出题数多的策略 or 做出题数一样,选择时间少的if(num<fin_num||num==fin_num&&tme>=fin_time) return;
// updatefin_num=num;
fin_time=tme;
for(inti=0; i<num; i++)
id[i] =tid[i];
}
// 完成题数 用掉的时间 总消耗时间voiddfs(intnum, intused, inttme)
{
intfst_time=used+T[tid[num]];
intdeg_times= (fst_time-1) /60;
intnxt_used=fst_time+deg_times*D[tid[num]];
intnxt_time=tme+nxt_used+deg_times*20;
if(nxt_used<=H*60) // 规定时间内能成功提交本题    {
num++;
if(num<N) // 还有未完成的题        {
for(inti=0; i<N; i++) // 尝试每个可走的岔路            {
if(!vis[i])
                {
vis[i]=1;
tid[num]=i;
dfs(num, nxt_used, nxt_time);
vis[i]=0;
// 不用num--,num是形参,每层的num都不一样                }
            }
        }
elseupdate(num, nxt_time); // 无题可做    }
elseupdate(num, tme); // 超时。找到一种策略,回到上一层}
intmain()
{
while( ~scanf("%d", &H) &&H>0 )
    {
init();
scanf("%d%d", &N, &T0);
for( inti=0; i<N; i++ )
cin>>name[i] >>T[i] >>D[i];
for( inti=0; i<N; i++ )
        {
vis[i] =1;
tid[0] =i;
dfs(0, T0, 0);
vis[i] =0;
        }
printf("Total Time = %d\n", fin_time);
for(inti=0; i<fin_num; i++)
printf("%s\n", name[id[i]].c_str());
    }
return0;
}


目录
相关文章
|
存储 运维 监控
云服务运维智能时代:阿里云操作系统控制台
阿里云操作系统控制台是一款创新的云服务器运维工具,采用智能化和可视化方式简化运维工作。通过AI技术实时监控服务器状态,自动分析性能瓶颈和故障原因,生成详细的诊断报告与优化建议。用户无需复杂命令行操作,仅需通过图形化界面即可高效处理问题,降低技术门槛并提升故障处理效率。尤其在服务器宕机等紧急情况下,智能诊断工具能快速定位问题根源,确保业务稳定运行。此外,控制台还提供内存、存储、网络等专项诊断功能,帮助用户全面了解系统资源使用情况,进一步优化服务器性能。这种智能化运维方式不仅提升了工作效率,也让个人开发者和企业用户能够更专注于核心业务的发展。
|
SQL 数据库 数据安全/隐私保护
Umbraco CMS 一键启动
**Umbraco 项目创建指南**您可以快速搭建并运行一个基于 Umbraco 的网站。
359 7
|
Web App开发 iOS开发 MacOS
如何在浏览器中启用夜间模式?
【10月更文挑战第10天】
|
关系型数据库 分布式数据库 数据库
首届全国大学生计算机系统能力大赛PolarDB数据库创新设计赛(天池杯)圆满收官
首届全国大学生计算机系统能力大赛PolarDB数据库创新设计赛(天池杯)圆满收官
491 1
|
监控 数据挖掘 BI
企业CRM选择指南:悟空CRM和销帮帮的适用场景分析
销售易旗下的悟空CRM和销帮帮分别针对不同企业需求提供了独特的CRM解决方案。悟空CRM以其智能数据分析、移动办公支持、客户360度视图及自定义工作流等优势,适合中大型企业;而销帮帮则以简单易用、销售漏斗管理、客户跟进提醒及高性价比等特点,更适合中小企业和初创企业。两者各具特色,助力企业在数字化转型中提升竞争力。
|
算法
数据结构之旅行商问题(深度优先搜索)
旅行商问题(TSP)是寻找访问多个城市并返回起点的最短路径的经典问题。本文介绍了TSP的背景、应用、复杂性和解决方法,重点讲解了使用深度优先搜索(DFS)算法求解TSP的过程。通过邻接矩阵表示城市间的距离,利用访问数组和栈结构辅助DFS遍历,最终找到最优路径。此方法虽然能保证找到最优解,但时间复杂度高,适用于城市数量较少的情况。示例代码展示了算法的具体实现及结果分析。
610 2
|
机器学习/深度学习 人工智能 自动驾驶
2024.10|AI/大模型在机器人/自动驾驶/智能驾舱领域的最新应用和深度洞察
本文介绍了AI和大模型在机器人、自动驾驶和智能座舱领域的最新应用和技术进展。涵盖多模态大语言模型在机器人控制中的应用、移动机器人(AMRs)的规模化部署、协作机器人的智能与安全性提升、AR/VR技术在机器人培训中的应用、数字孪生技术的优化作用、Rust语言在机器人编程中的崛起,以及大模型在自动驾驶中的核心地位、端到端自动驾驶解决方案、全球自动驾驶的前沿进展、智能座舱的核心技术演变和未来发展趋势。
1403 2
|
自然语言处理 测试技术 开发者
通义灵码全面评测:以PyCharm为例,展示智能编码助手的强大功能
《通义灵码全面评测:以PyCharm为例,展示智能编码助手的强大功能》
|
人工智能 自然语言处理 搜索推荐
ECCV 2024:一眼临摹:瞥一眼就能模仿笔迹的AI
 【10月更文挑战第10天】在人工智能领域,手写文本生成技术迎来新突破。最新研究提出“一眼临摹”AI技术,仅需一个手写样本文即可模仿任意书法风格。该技术核心为One-DM模型,结合扩散模型与风格增强模块,实现高效、多样且高质量的手写文本生成,广泛应用于数字签名、个性化信件及艺术创作等领域。
1153 2
|
前端开发 JavaScript 应用服务中间件
Nginx 支持 JavaScript:前所未有的扩展
Nginx 是全球领先的高性能 Web 服务器,以其高效的反向代理和负载均衡功能著称。近期,Nginx 正式支持 JavaScript(通过 NJS 模块),基于 V8 引擎,允许在配置中嵌入 JS 代码,极大提升了灵活性和扩展性。开发者可以使用 JavaScript 实现动态请求处理、自定义认证、复杂响应处理、中间件编写及流量控制等功能,显著降低开发和维护难度,同时保持高性能。NJS 模块的引入为 Nginx 带来了前所未有的扩展能力,适应快速变化的业务需求。
481 0

热门文章

最新文章