4 November in ss

本文解析了四道ACM竞赛题目,包括输油管道问题、跑步比赛策略、流图判定及物品选取优化,涉及贪心算法、模拟、DFS和尺取法,通过实例代码展示了算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Contest

A. 输油管道问题

某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有 \(n\) 口油井的油田。从每口油井都要有一条输油管道沿最短路经 (或南或北) 与主管道相连。如果给定 \(n\) 口油井的位置, 即它们的 \(x\) 坐标(东西向)和 \(y\) 坐标(南北向), 应如何确定主管道的最优位置, 即使各油井到主管道之间的输油管道长度总和最小的位置? 证明可在线性时间内确定主管道的最优位置。 \(1\le n\le 10000\)

观察到 \(x\) 坐标与答案无关,题目转变为求 \(\sum |Y-y_i|\) 的最大值。

贪心。易证,中位数即为 \(Y\) 的值。

当然我在考场上是用玄学二分做出来的。)

B. ssoj3147 跑步(run)

小 A 要参加一次 1000 米跑步比赛。 一开始他的速度为 1 m/s,在跑步过程中他会越跑越累,所以会进行若干次减速。第一次减速后,速度变为 \(\frac{1}{2}\) m/s;第二次减速后,速度变为 \(\frac{1}{3}\) m/s,依次类推。你现在知道小 A 会在什么时间或者是哪里进行减速,有 \(n\) 个这样的事件:T x 表示小 A 会在比赛开始后 \(x\) 秒进行一次减速。D x 表示小 A 会在恰好跑了 \(x\) 米之后进行一次减速。现在给你这些事件。你要帮小 A 算出他用这种方式到达终点所需要的时间是多少秒。可能存在两个事件恰好同时发生,那么在这一时刻速度就会减小两次。

模拟即可。注意时间、位移、速度的先后顺序,以及哨兵变量自增的时机。考场上就是这点折腾了我好久。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
 
int n, t[10003], d[10003], vn=1;
double lt, ld, v=1;
 
int main() {
    scanf("%d", &n);
    for (int k=1; k<=n; ++k) {
        int a=0;
        char c=getchar(); while (c!='T' && c!='D') c=getchar(); scanf("%d", &a);
        if (c=='T') t[++t[0]]=a; else d[++d[0]]=a;
    }
    sort(t+1, t+t[0]+1); sort(d+1, d+d[0]+1);
    for (int i=1, j=1; i<=t[0] && j<=d[0]; ) {
        double dt=(t[i]-lt)*v + ld;
        if (dt<d[j]) lt=t[i++], ld=dt, v=1.0/(++vn);
        else if (dt>d[j]) lt+=(d[j]-ld)/v, ld=d[j++], v=1.0/(++vn);
        else lt=t[i++], ld=dt, ++j, vn+=2, v=1.0/vn;
        if (i>t[0]) { 
            for (; j<=d[0]; ++j) lt+=(d[j]-ld)/v, ld=d[j], v=1.0/(++vn);
            break;
        }
        if (j>d[0]) {
            for (; i<=t[0]; ++i) ld+=(t[i]-lt)*v, lt=t[i], v=1.0/(++vn);
            break;
        }
    }
    if (ld<1000.0) lt+=(1000.0-ld)/v;
    printf("%.0lf\n", lt);
    return 0;
}

C. ssoj2977 流图(flow)

如果一张有向图存在一个点可以到达所有的点,则称这个图是一个流图 (Flow Graph)。现在给定一张有向图,请判断这张图是不是流图;如果是,输出所有的点 \(r\) 满足点 \(r\) 可以到达图中的所有点。\(1\le n,m\le 1000\)

DFS?!! 注意到不重复 DFS 全图的时间复杂度是 \(O(m)\),所以可以采用 \(O(nm)\) 的极端暴力做法,即以每个点为起点跑 DFS。太暴力了考场上没想出来……

#include <cstdio>
#include <cstring>
 
int n, m, ant, ans[1005];
int head[1005], nex[1005], to[1005];
int v[1005], cnt;
 
inline void add(int x, int y) {
    nex[++head[0]]=head[x], head[x]=head[0], to[head[0]]=y;
}
void dfs(int x) {
    for (int i=head[x]; i; i=nex[i]) if (!v[to[i]])
        ++cnt, v[to[i]]=1, dfs(to[i]);
}
 
int main() {
    scanf("%d%d", &n, &m);
    for (int i=1, a, b; i<=m; ++i)
        scanf("%d%d", &a, &b), add(a, b);
    for (int i=1; i<=n; ++i) {
        memset(v, 0, sizeof v); cnt=1, v[i]=1;
        dfs(i); if (cnt==n) ans[++ant]=i;
    }
    if (!ant) {putchar('0'); return 0; }
    printf("%d\n", ant);
    for (int i=1; i<=ant; ++i) printf("%d ", ans[i]);
    return 0;
}

D. ssoj3146 物品选取

\(n\) 件物品,每件物品尺寸为 \(A_i\),价值为 \(B_i\)。令 \(A_\max\) 为所选物品中最大的尺寸,\(A_\min\) 为所选物品中最小的尺寸。令 \(sum\) 为选择物品的价值之和。选择一些物品,使得 \(sum−(A_\max−A_\min)\) 最大。\(2\le n\le 5\times 10^5, 1\le A_i\le 10^{15}, 1\le B_i\le 10^9\)

容易想到按照 \(A\) 排序,枚举最值。\(sum\) 预处理前缀和。可得 \(O(n^2)\) 做法。显然不是正解。

考虑用算式表示答案:令 \(i\) 为最大值,\(j\) 为最小值,最大化 \(sum(i)-sum(j-1)-A_i+A_j=sum(i)-A_i+A_j-sum(j-1)\)。当前状态答案只与 \(i,j\) 有关。

尺取法。枚举 \(i\),对于每个 \(i\),维护 \(A_j-sum(j-1)\) 的最大值。时间复杂度降为 \(O(n)\)

#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long
 
int n; ll sum[500003], ans;
struct node {
    ll A, B;
    bool operator < (const node& a) const {return A<a.A; }
} p[500003];
 
int main() {
    scanf("%d", &n);
    for (int i=1; i<=n; ++i) scanf("%lld%lld", &p[i].A, &p[i].B);
    sort(p+1, p+n+1);
    for (int i=1; i<=n; ++i) sum[i]=sum[i-1]+p[i].B;
    ll m=0, t=0;
    for (int i=1; i<=n; ++i) {
        m=sum[i]-p[i].A;
        t=max(t, p[i].A-sum[i-1]);
        ans=max(ans, m+t);
    }
    printf("%lld\n", ans);
    return 0;
}

小结

都是简单的做法,但是因为时间复杂度估计失误,不敢于写出来。看来暴力、贪心写得不够多……是啊,既然都是 NOIP 范围内的知识,那怎么区分高手?还是依靠思维难度取胜!

转载于:https://www.cnblogs.com/greyqz/p/9915190.html

uz-UZ-Latn api-ms-win-core-localization-l1-2-1 Failed to resolve full path to executable %ls. sr-BA-Latn div-MV LOADER: length of teporary directory path exceeds maximum path length! Wednesday advapi32 sma-se ext-ms-win-ntuser-windowstation-l1-1-0 Friday Tuesday zh-cht api-ms-win-core-fibers-l1-1-1 HH:mm:ss Failed to get address for %hs PyInstaller Onefile Hidden Window MM/dd/yy smj-no D:(A;;FA;;;%s)(A;;FA;;;%s) WARNING CreateDirectory uz-uz-cyrl Failed to load Python DLL '%ls'. api-ms-win-core-fibers-l1-1-2 api-ms-win-core-sysinfo-l1-2-1 quz-ec GetModuleFileNameW zh-CHS Failed to execute script '%ls' due to unhandled exception: %ls kok-IN Needs to remove its temporary files. sr-BA-Cyrl api-ms-win-rtcore-ntuser-window-l1-1-0 LOADER: failed to create runtime-tmpdir path %ls! mscoree.dll Failed to convert executable path to UTF-8. sr-sp-cyrl S-1-3-4 az-AZ-Cyrl #+3;CScs az-AZ-Latn sma-NO LOADER: failed to obtain the absolute path of the runtime-tmpdir. January GetProcAddress quz-EC February api-ms-win-core-file-l2-1-4 api-ms-win-core-localization-obsolete-l1-2-0 sms-fi smn-FI az-az-latn smn-fi October Security descriptor string length exceeds PYI_PATH_MAX! div-mv api-ms-win-security-systemfunctions-l1-1-0 sr-SP-Cyrl ext-ms- smj-se bs-ba-latn api-ms-win-core-file-l1-2-2 Unhandled exception in script quz-pe VCRUNTIME140.dll Saturday ext-ms-win-ntuser-dialogbox-l1-1-0 LOADER: failed to expand environment variables in the runtime-tmpdir. [PYI-%d:ERROR] api-ms-win-core-synch-l1-2-0 kok-in LOADER: failed to set the TMP environment variable. api-ms-win-core-processthreads-l1-1-2 api-ms-win-core-xstate-l2-1-0 Failed to obtain/convert traceback! LoadLibrary sr-SP-Latn smj-NO Failed to obtain executable path. ((((( H api-ms-win-core-file-l1-2-4 sma-no quz-BO STATIC <FormatMessageW failed.> api-ms-win-core-string-l1-1-0 [PYI-%d:%ls] sma-SE quz-PE user32 VCRUNTIME140_1.dll Failed to create child process! api-ms-win-appmodel-runtime-l1-1-2 November api-ms-win-core-datetime-l1-1-1 api-ms-win-core-winrt-l1-1-0 CreateProcessW August zh-CHT kernelbase PyInstallerOnefileHiddenWindow Thursday D:(A;;FA;;;%s) (null) CONOUT$ LOADER: failed to convert runtime-tmpdir to a wide string. az-az-cyrl December September Monday LOADER: runtime-tmpdir points to non-existent drive %ls (type: %d)! smj-SE uz-uz-latn BUTTON ]Warning UTF-16LEUNICODE kernel32 sr-ba-latn syr-sy Sunday sr-sp-latn uz-UZ-Cyrl api-ms- bs-BA-Latn dddd, MMMM dd, yyyy zh-chs sr-ba-cyrl sms-FI syr-SY _MEI%d ( quz-bo / P6pL /-P?pR ,/KPip 判断是否是木马字符。
05-26
(1)编写一个程序,在屏幕上实时地显示时间和日期(如 2025-6-4 15:32:58 显示为 03:32:58.32 P.M., Wednesday, June 4, 2025),直到按下任意一个键才退出程序。(注:这里例子里给的58秒后面的32是百分秒) (2)显示时间、显示日期功能以子程序结构编写。 编程提示: 1. 获取当前时间(2C号功能调用) MOVAH,2CH INT21H 出口参数: CH=小时(二进制表示的0~23,后面寄存器获取的数也均为二进制) CL=分钟(0~59) DH=秒(0~59) DL=百分秒(0~99) 2. 获取当前日期(2A号功能调用) MOVAH,2AH INT21H 出口参数: AL=星期值(0~6,星期日=0,……,星期六=6) CX=年(1980~2099) DH=月(1~12) DL=日(1~31) 3. 测试是否有键按下(06号功能调用) MOVAH,06H MOVDL,0FFH INT21H 出口参数: ZF=1表示无按键 ZF=0表示有按键,AL=按键码 请编写显示时间和日期的子程序,下面为框架 ;显示字符的宏定义 DISP MACRO CHAR PUSH AX PUSH DX MOV DL,CHAR ;显示字符 mov ah,2 INT 21H POP DX POP AX ENDM DATA SEGMENT D_TAB DW SUN,MON,TUE,WED,THU,FRI,SAT ;星期名指针表 M_TAB DW JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DCE ;月份名指针表 ;星期名字符串 SUN DB 'Sunday$' MON DB 'Monday$' TUE DB 'Tuesday$' WED DB 'Wednesday$' THU DB 'Thursday$' FRI DB 'Friday$' SAT DB 'Saturday$' ;月份名字字符串 JAN DB 'January$' FEB DB 'February$' MAR DB 'March$' APR DB 'April$' MAY DB 'May$' JAN DB 'June$' JUL DB 'July$' AUG, DB 'August$' SEP DB 'September$' OCT DB 'October$' NOV DB 'November$' DCE DB 'December$' TMT DB ' .M.,$' SPACE= 20H DATA ENDS stack_seg segment para stack 'stack' db 100h dup(7) stack_seg ends CODE SEGMENT ASSUME CS:CODE, DS:DATA,ss:stack_seg ; 主程序 START: MOV AX, DATA MOV DS, AX MOV AX,stack_seg MOV SS,AX LLL: CALL TIMES ;显示时间 CALL DATES ;显示日期 DISP 0DH ;回车 DISP 0AH ;换行 MOV AH,06H MOV DL,0FFH INT 21H JE LLL MOV AH,4CH INT 21H ;显示时间的子程序 ;显示日期的子程序 CODE ENDS END START
06-27
内容概要:该PPT详细介绍了企业架构设计的方法论,涵盖业务架构、数据架构、应用架构和技术架构四大核心模块。首先分析了企业架构现状,包括业务、数据、应用和技术四大架构的内容和关系,明确了企业架构设计的重要性。接着,阐述了新版企业架构总体框架(CSG-EAF 2.0)的形成过程,强调其融合了传统架构设计(TOGAF)和领域驱动设计(DDD)的优势,以适应数字化转型需求。业务架构部分通过梳理企业级和专业级价值流,细化业务能力、流程和对象,确保业务战略的有效落地。数据架构部分则遵循五大原则,确保数据的准确、一致和高效使用。应用架构方面,提出了分层解耦和服务化的设计原则,以提高灵活性和响应速度。最后,技术架构部分围绕技术框架、组件、平台和部署节点进行了详细设计,确保技术架构的稳定性和扩展性。 适合人群:适用于具有一定企业架构设计经验的IT架构师、项目经理和业务分析师,特别是那些希望深入了解如何将企业架构设计与数字化转型相结合的专业人士。 使用场景及目标:①帮助企业和组织梳理业务流程,优化业务能力,实现战略目标;②指导数据管理和应用开发,确保数据的一致性和应用的高效性;③为技术选型和系统部署提供科学依据,确保技术架构的稳定性和扩展性。 阅读建议:此资源内容详尽,涵盖企业架构设计的各个方面。建议读者在学习过程中,结合实际案例进行理解和实践,重点关注各架构模块之间的关联和协同,以便更好地应用于实际工作中。
资 源 简 介 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系, 详 情 说 明 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。 本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系,在此基础上重点分析了一种快速ICA实现算法一FastICA。物质的非线性荧光谱信号可以看成是由多个相互独立的源信号组合成的混合信号,而这些独立的源信号可以看成是光谱的特征信号。为了更好的了解光谱信号的特征,本文利用独立分量分析的思想和方法,提出了利用FastICA算法提取光谱信号的特征的方案,并进行了详细的仿真实验。 此外,我们还进行了进一步的研究,探索了其他可能的ICA应用领域,如音乐信号处理、图像处理以及金融数据分析等。通过在这些领域中的实验和应用,我们发现ICA在提取信号特征、降噪和信号分离等方面具有广泛的潜力和应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值