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;
}


目录
相关文章
|
存储 人工智能 监控
如何使数据中心现代化以提高其可持续性
在可能的情况下,数据中心的电力将更多地采用可再生能源,其中包括电池储能系统,而不是基于化石燃料的备用发电设施,以实现短期弹性。
208 0
|
7天前
|
人工智能 安全 Linux
【OpenClaw保姆级图文教程】阿里云/本地部署集成模型Ollama/Qwen3.5/百炼 API 步骤流程及避坑指南
2026年,AI代理工具的部署逻辑已从“单一云端依赖”转向“云端+本地双轨模式”。OpenClaw(曾用名Clawdbot)作为开源AI代理框架,既支持对接阿里云百炼等云端免费API,也能通过Ollama部署本地大模型,完美解决两类核心需求:一是担心云端API泄露核心数据的隐私安全诉求;二是频繁调用导致token消耗过高的成本控制需求。
4902 7
|
15天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
20692 113
|
10天前
|
人工智能 API 网络安全
Mac mini × OpenClaw 保姆级配置教程(附阿里云/本地部署OpenClaw配置百炼API图文指南)
Mac mini凭借小巧机身、低功耗和稳定性能,成为OpenClaw(原Clawdbot)本地部署的首选设备——既能作为家用AI节点实现7×24小时运行,又能通过本地存储保障数据隐私,搭配阿里云部署方案,可灵活满足“长期值守”与“隐私优先”的双重需求。对新手而言,无需复杂命令行操作,无需专业技术储备,按本文步骤复制粘贴代码,即可完成OpenClaw的全流程配置,同时接入阿里云百炼API,解锁更强的AI任务执行能力。
6575 2
|
11天前
|
人工智能 安全 前端开发
Team 版 OpenClaw:HiClaw 开源,5 分钟完成本地安装
HiClaw 基于 OpenClaw、Higress AI Gateway、Element IM 客户端+Tuwunel IM 服务器(均基于 Matrix 实时通信协议)、MinIO 共享文件系统打造。
7941 6

热门文章

最新文章