题意是n本书排成一堆,按给定的顺序读m次,每次读第bi本书。每本书有重量,读第bi本书的时候,代价就是所有在bi上面的书的总重量。看完后就直接放回书堆的最上层。要求确定一开始书的位置,使得代价尽量小
一开始我就是直接按每本书第一次出现的顺序搞的。比如样例1 3 2 3 1就直接确定为1 3 2 结果数据还真A了……结果最后因为小号交了一遍所以skipped……我真是无话可说……就是因为这个我从1900+掉到1800+了
后来想清楚了
假设我们考虑两本书i,j放的顺序对代价的影响,写一写就很容易发现影响只跟它第一次出现的顺序有关
比如一个看书的序列2 3 ……
有两种放法:2 3 ……或者3 2 ……
显然第一种的代价是w[2],第二种的代价是w[2]+w[3],显然第一种放法优
很容易发现按照2 3的顺序读书读完,它们的位置就唯一确定了。一定是3在2上面。后面也许还会出现要读2和3的情况,但是代价已经确定了
所以就是贪心完模拟啦
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<deque> #include<set> #include<map> #include<ctime> #define LL long long #define inf 0x7ffffff using namespace std; inline LL read() { LL x=0,f=1; char ch= getchar (); while (ch< '0' ||ch> '9' ){ if (ch== '-' )f=-1;ch= getchar ();} while (ch>= '0' &&ch<= '9' ){x=x*10+ch- '0' ;ch= getchar ();} return x*f; } int n,m,ans; int a[200010],b[200010]; int lst[200010],nex[200010],succ[200010]; int main() { n=read();m=read(); for ( int i=1;i<=n;i++)a[i]=read(); for ( int i=1;i<=m;i++)b[i]=read(); for ( int i=m;i>=1;i--) { nex[i]=lst[b[i]]; lst[b[i]]=i; } for ( int i=1;i<=m;i++) { if (nex[i])succ[nex[i]]=i; } for ( int i=1;i<=m;i++) { int x=succ[i]+1; bool mrk[1010]={0}; for ( int j=x;j<=i-1;j++) { if (!mrk[b[j]])ans+=a[b[j]],mrk[b[j]]=1; } } printf ( "%d\n" ,ans); return 0; } |
——by zhber,转载请注明来源
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· Supergateway:MCP服务器的远程调试与集成工具