TopCoder SRM194C: IslandFerries 题解

Codeforces #713C: Sonya and Problem without a Legend 题解 如果做过cf 13C sequence应该马上就能发现这两道题惊人的相似 但是这题要求严格递增,怎么办呢? 于是有一个神奇的做法 对于a[i],将其减去i,得到新数组b,b数组中只要保证不下降,a就能保证严格递增 于是可以上dp代码了 (dp方程可以看13C sequence) #include #include #include #include #include #inc 阅读详情

十分坑爹,题目中写的是“当你用完一张票到其他岛屿上时,你的手中只能有0,1,2张票,所以事实上任意时刻你的手上最多能有3张票
考虑状压dp
dp[i][Mask]表示当前在i号岛屿,现在手上有的票为Mask的最小代价
通过船票来进行转移即可

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <utility>
#include <cctype>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#define LL long long
#define LB long double
#define x first
#define y second
#define Pair pair<int,int>
#define pb push_back
#define pf push_front
#define mp make_pair
#define LOWBIT(x) x & (-x)
using namespace std;

const int MOD=1e9+7;
const LL LINF=2e16;
const int INF=2e9;
const int magic=348;
const double eps=1e-10;
const double pi=3.14159265;

inline int getint()
{
    char ch;int res;bool f;
    while (!isdigit(ch=getchar()) && ch!='-') {}
    if (ch=='-') f=false,res=0; else f=true,res=ch-'0';
    while (isdigit(ch=getchar())) res=res*10+ch-'0';
    return f?res:-res;
}

class IslandFerries
{
    public:
        int price[48][48];Pair route[48][48];int num[48];
        int dp[48][1048];queue<int> q;bool inq[48][1048];
        int n,m;
        inline int STRING_TO_INT(string s)
        {
            int res=0,len=int(s.size()),i;
            for (i=0;i<=len-1;i++) res=res*10+s[i]-'0';
            return res;
        }
        inline void doit_price(int ind,string s)
        {
            s+=" ";
            int i,pos,pos1,len=int(s.size());
            for (i=1,pos=0;i<=m && pos<=len-1;i++,pos=pos1+1)
            {
                pos1=s.find(' ',pos);
                price[ind][i]=STRING_TO_INT(s.substr(pos,pos1-pos));
            }
        }
        inline void doit_leg(int ind,string s)
        {
            s+=" ";string ss;
            int i,pos,pos1,len=int(s.size()),pp1,pp2;
            num[ind]=0;
            for (i=1,pos=0;pos<=len-1;pos=pos1+1)
            {
                pos1=s.find(" ",pos);
                ss=s.substr(pos,pos1-pos);
                pp1=ss.find('-');
                route[ind][++num[ind]].x=STRING_TO_INT(ss.substr(0,pp1))+1;
                route[ind][num[ind]].y=STRING_TO_INT(ss.substr(pp1+1,int(ss.size())-pp1))+1;
            }
        }
        inline vector<int> costs(vector<string> legs,vector<string> prices)
        {
            int i,j,k,cur,Mask,to,toMask,cnt;
            m=int(legs.size());n=int(prices.size());
            for (i=1;i<=n;i++) doit_price(i,prices[i-1]);
            for (i=1;i<=m;i++) doit_leg(i,legs[i-1]);
            for (i=1;i<=n;i++)
                for (Mask=0;Mask<=(1<<m)-1;Mask++)
                    dp[i][Mask]=INF;
            dp[1][0]=0;q.push(1);q.push(0);
            memset(inq,false,sizeof(inq));inq[1][0]=true;
            while (!q.empty())
            {
                cur=q.front();q.pop();Mask=q.front();q.pop();inq[cur][Mask]=false;
                cnt=__builtin_popcount(Mask);
                for (i=1;i<=m;i++)
                    if (Mask&(1<<(i-1)))
                    {
                        for (j=1;j<=num[i];j++)
                            if (route[i][j].x==cur)
                            {
                                to=route[i][j].y;toMask=(Mask^(1<<(i-1)));
                                if (dp[to][toMask]>dp[cur][Mask])
                                {
                                    dp[to][toMask]=dp[cur][Mask];
                                    if (!inq[to][toMask]) inq[to][toMask]=true,q.push(to),q.push(toMask);
                                }
                            }
                    }
                    else
                    {
                        if (cnt>=3) continue;
                        to=cur;toMask=(Mask|(1<<(i-1)));
                        if (dp[to][toMask]>dp[cur][Mask]+price[cur][i])
                        {
                            dp[to][toMask]=dp[cur][Mask]+price[cur][i];
                            if (!inq[to][toMask]) inq[to][toMask]=true,q.push(to),q.push(toMask);
                        }
                    }
            }
            vector<int> res;
            for (i=2;i<=n;i++) if (dp[i][0]>=INF) res.pb(-1); else res.pb(dp[i][0]);
            return res;
        }
};

/*---Debug Part---*/
/*
int main ()
{
    int nn,mm;
    IslandFerries A;
    while (scanf("%d%d",&nn,&mm)!=EOF)
    {
        vector<string> aa,bb;
        int i;string s;getchar();
        for (i=1;i<=mm;i++) getline(cin,s),aa.pb(s);
        for (i=1;i<=nn;i++) getline(cin,s),bb.pb(s);
        vector<int> ans=A.costs(aa,bb);
        for (i=0;i<int(ans.size());i++) cout<<ans[i]<<endl;
    }
    return 0;
四边形不等式和完全单调性 四边形不等式 如果有一个矩阵MMM,对于任意a&lt;ba&lt;bac&lt;dc&lt;dcM(a,c)+M(b,d)≥M(a,d)+M(b,c)M(a,c)+M(b,d)≥M(a,d)+M(b,c)M(a,c)+M(b,d)\geq M(a,d)+M(b,c),我们称这个矩阵满足四边形不等式 我们考虑一个简单的问题:如何验证一个矩阵是否满足四边形不等式? 显然有O(n2m2)O(n2m... 阅读详情

相关推荐

Codeforces #360B: Levko and Array 题解

首先问题满足单调性,所以可以二分答案,设二分出的答案为h 这题n 设dp[i]为第i个数字不修改时满足答案h最少要修改的次数 枚举上一次不修改的位置j 那么j+1~i-1的位置的数都是要修改的 一个显然的结论是,这n个数应该修改得使其均匀的分布在a[i]~a[j]之间,这样相邻差的最大值最小,为abs(a[i]-a[j])/i-j 上取整 所以如果算完在h之内,dp[i]=min(dp

IcePrincess_1968's World 642

TopCoder SRM461C: FencingGarden 题解

我们首先可以发现一个性质:因为只会有两个小段是被切出来的,而篱笆有三条边,所以必然有一条边是由未被切割的篱笆构成的 我们设这条边的长度为x,所有篱笆的长度和为s,有两种情况 1. 这条边与墙平行,则面积S=xs−x2=−12x2+12sxS=xs−x2=−12x2+12sxS=x \frac{s-x}{2}=-\frac{1}{2}x^2+\frac{1}{2}sx 2. 这条边与墙垂直,则...

IcePrincess_1968's World 585

客车与货车过轮渡(ferry)

某汽车轮渡口,有n辆车要过河。n辆车只有两种要么是客车,要么是货车。已知过江渡船每次能载10辆车,从0分开始每10分钟来一次(即0分一辆,10分一辆,以此类推)。又知上渡船要遵守下述规定:若x分来了一辆渡船所有到大渡口时间<=x分且还没过河的车辆才可能上船,且客车先于货车上船,每上4辆客车必上1辆货车,这时若没有货车就上客车,若没有客车就上货车。试编写一个程序,模拟渡口的管理,统计客车和货车的平均等待时间。 Input格式 第一行一个正整数n(1000 <= n <= 1000 000),表示要过江的车辆总数。 第二行到n+1行每行两个非负整数type,time(0 <= time <= 1000 000),表示time分到达渡口的车是type类型,type为0表示客车,为1表示货车,时间从0开始计,且按到达时间先后给出数据。 Output格式 一行两个保留两位的小数(四舍五入)carWaitTime,trunkWaitTime以空格分开,carWaitTime表示客车的平均等待时间,trunkWaitTime表示货车的平均等待时间。

TopCoder SRM469C: TheMoviesLevelThreeDivOne 题解

很好的dp题目 我们尝试推断某一个人A能不间断的看完电影的条件 易得,A想要在看完B的第i-1部电影之后不间断的看B的第i部电影,应该满足以下条件:∑Atotk=1A[xk]+∑i−1k=1A[yk]−∑ik=1B[yk]≥0∑k=1AtotA[xk]+∑k=1i−1A[yk]−∑k=1iB[yk]≥0\sum_{k=1}^{Atot}A[x_k]+\sum_{k=1}^{i-1}A[y_k]...

IcePrincess_1968's World 515

故障转移集群无法连接到节点_Windows 2012系统群集故障转移集群

理论知识很重要!集群和群集是什么意思?其实看到标题可能会感觉有点绕,简单易懂的来说一下:集群,英文名称为Cluster,集群的意思就是将多个系统连接在一起,可以让多台服务器能够像一台服务器那样工作。通常采用集群系统是为了提高系统的稳定性和网络中心的数据处理能力以及服务能力。第二个就是:群集,其实这个概念也不难理解,群集是把多个计算机连接在一起,形成整形,随后可以更好的利用设备资源的一项新...

weixin_39535283的博客 3250

Badcase归因分析“四部曲”

badcase是业内的专业名词,简单解释一下。bad是坏,case是案例,说白了就是模型或者具体规则无法很好预测的那些案例。以分类模型为例,本来一个样本应该是负类的,结果预测为正类,那这个样本就能被称为bad case。那相对应的就是good case就是优秀案例。

qq_25438419的博客 3519

Topcoder SRM 698 题解

D1L1 枚举分界点。 拆成两个串,然后就是个类似于LCS的DP了。 #include <iostream> #include <cstring> using namespace std; const int INF = 1e9+7; int dp[102][102]; struct RepeatString { int minimalModify(string...

weixin_34273046的博客 215

阿里云大模型 ACP 认证教材内容突变?这些改动藏着通关密码,不看亏大!

【摘要】核心章节大换血,安全合规融入实战场景,大模型微调用数学深度解析,部署章节带来阿里云产品对比实战攻略,甚至整章内容被替换成藏满学习彩蛋的行业趋势指南。这些改动不仅重塑考试重点,更暗藏官方命题风向——安全合规考场景方案,微调原理考几何解析,部署设计考分析框架。无论你是数学小白还是部署新手,这篇攻略都将带你吃透变动逻辑,附赠急救包和考点清单,帮你抓住这些“隐形加分项”,速来解锁通关秘籍!

davidkorhenn的博客 1755

USACO 2018 January Contest Platinum A: Lifeguards 题解

将所有的区间按左端点从小到大排序 我们处理那些被完全包含的区间,这些区间即使删除也不会使答案变坏 这样先删一波,如果发现这种小区间的个数多于k,就可以直接算答案了 否则我们要dp 设dp[i][j]为考虑到第i个区间,已经删除了j个区间,且第i个区间没有被删除的情况下最大的覆盖长度 显然有状态转移方程dp[i][j]=max(dp[k][j-i-k-1]+第i个区间贡献的覆盖) 这个方

IcePrincess_1968's World 1923

超螺旋滑模控制(STA)

超螺旋滑模控制又称超扭滑模控制,可以说是二阶系统中最好用的滑模控制方法。

Lyajpunov的博客 1万+

层层剥开Allegro skill--快速抓取并写入Allegro软件【呕血创作,转载注明】

Allegro skill eda pcb

qq_36492361的博客 1253

Codeforces GYM 100753J: Souvenirs 题解

这题是显然的dp 设dp[i][j][k]为考虑到第i个商人(第i个商人已经处理完),当前有j个金币和k个银币时,最多能买到多少纪念品 1.不买第i个纪念品,dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k]) 2.用金币买第i个纪念品,dp[i][j][k]=max(dp[i][j][k],dp[i-1][j+1][k-get*pack[i]]+1) ge

IcePrincess_1968's World 930

锂电池SOH估计 | 锂电池SOH基础计算与可视化(Python)

锂电池SOH估计 | 锂电池SOH基础计算与可视化(Python)

前程算法屋的博客 900

TopCoder SRM477C: KingdomTour 题解

很难的dp题 如果不加shortcut,那么显然只有一种遍历方案,每条边都走了两遍 shortcut只能走一次,而树边可以走无数次,不统一不方便,考虑转化模型 可以想到每条树边最多走两次,一上一下,走更多的次数显然没有好处 可以把每条树边拆成两条边,规定每条边只能走一次,这样这些边的性质就和shortcut一样了 我们可以从欧拉图的角度来考虑这件事情,拆边以后,每个点的度数都是偶数,所以...

IcePrincess_1968's World 865

02 HCM CPI SF集成-组织集成(一)

将员工主数据和组织数据从SAP Successfactors Employee CentraI复制到SAPERP或SAP S/4HANA,SAP SF CPI HCM集成

SAP CPI 129

使用Simulink进行四足机器人的非线性动力学建模与仿真

四足机器人的运动包含多个自由度(DOF),包括腿部的摆动和支撑阶段的动力学特性。由于存在接触力、摩擦以及不同地形的影响,四足机器人的动力学行为呈现出高度的非线性特征。因此,构建准确的非线性动力学模型对于研究机器人的运动学和动力学特性至关重要。定义代表机器人状态的变量,如位置、速度、角度和角速度。matlab深色版本通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的非线性动力学模型,并进行了详细分析。

xiaoheshang_123的博客 311

TopCoder SRM450C: RowGame 题解

看到k这么大,我的思维立刻就往什么dp+矩乘或者是倍增上走 dp+矩乘看上去挺靠谱的,但是题目要求任意时刻权值非负,那么就得再加一维来控制当前的权值,而当前权值的范围是很大的,这样会超时 于是考虑仔细观察此题的性质 我们可以设想:如果k→infk→infk\rightarrow inf 那么我一定会想办法走到这个序列的最长子串上然后来回摆动 然而并不是能一下子走到最长子串上的,如果中间有一...

IcePrincess_1968's World 848

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

AtCoder Regular Contest 097F: Monochrome Cat 题解

这道题的思路非常巧妙 首先我们可以把那些全部都是黑点的子树扔掉,他们是不会被遍历的 这时,剩下的树的所有的叶子都是白色的 我们先考虑终点和起点重合的情况 这时如果我们想把它全部变黑的话必须遍历整棵树 并且我们发现,无论以哪个点为起点,答案都是一样的,首先所有的边都要走两遍,第二,一个点被走过的次数等于它的度数,所以一个点是否需要停留一秒也是可以算出来的(显然的是,一个点最多停留一秒),这...

IcePrincess_1968's World 790

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

UOJ #275: 组合数问题 题解

非常好的题目,感觉这个lucas的应用算是常见套路了吧 题目要求CMN≡0(modk)CNM≡0(modk)C_N^M\equiv0(modk),因为k是质数,所以根据Lucas定理,CM/kN/k∗CMmodkNmodk≡0(modk)CN/kM/k∗CNmodkMmodk≡0(modk)C_{N/k}^{M/k}*C_{Nmodk}^{Mmodk}\equiv 0(modk) 我们发现这个...

IcePrincess_1968's World 769

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Codeforces #995F: Cowmpany Cowmpensation 题解

非常好的dp题 首先可以参见topcoder randomapple的套路,就是我算这棵树的权值种数为i的方案数,最后乘CiDCDiC_D^i就好 考虑dp[i][j]表示以i为根的子树,i的权值不超过j的方案数 我们发现这样会重复计数,因为我们计算了一些本质相同的方案,比如全1和全2,他们各自在乘CiDCDiC_D^i的时候会把对方算进去 所以我们实际上要算的是本质不同的方案数 dp[...

IcePrincess_1968's World 730

Codeforces #39C: Moon Craters 题解

这道题一看就是dp,但感觉不知道怎样dp 刚开始想了一个dp[i]表示在前i个圆里面选互不重叠的最多能选几个,把圆先按右端点排序。但是圆的大小的任意性使得dp不正确 后来想了一个非常复杂的dp 先按圆的右端点从小到大排序,右端点相同的按半径大小从小到大排序,这样保证在考虑到第i个圆的时候,他不可能被前面的圆包含或是内切于前面的圆 对排序后的圆数组先做两个预处理: 1.对于圆i,记录右端点

IcePrincess_1968's World 686

Codeforces #590D: Top Secret Task 题解

这题显然的是dp 设计状态dp[u][i][j]为在前i个数中进行操作,swap次数不超过j次,前i个数的和最小是多少 对于第u个元素: 如果不将它放进前i个:dp[u][i][j]=dp[u-1][i][j] 如果将它放进前i个,一个显然的结论是,要使得交换次数最少,本来在序列中靠前的那些数最后在前i个数中也应靠前 所以应该将第u个数放在第i个,dp[u][i][j]=dp[u-1][

IcePrincess_1968's World 672

BZOJ1177: Oil 题解

Description 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井。被拍卖的整块土地为一个矩形区域,被划分为M×N个小块。 Siruseri地质调查局有关于Navalur土地石油储量的估测数据。这些数据表示为M×N个非负整数,即对每一小块土地石油储量的估计值。 为了避免出现垄断,政府规定每一个承包商只能承包一个由K×K块相连的土地构成的正方...

IcePrincess_1968's World 639

AtCoder Regular Contest 097E: Sorted and Sorted 题解

这个题目显然可以转化成:把黑白两个序列往一个大序列里面填,每次填黑的或白的,黑序列和白序列都要有序,每次填有一个代价是这个数之前还没有被填掉的数的个数,求最小的代价 我们考虑dp,dp[i][j]表示黑序列已经填了i个数,白序列已经填了j个数的最小代价 显然dp[i][j]是从dp[i-1][j]和dp[i][j-1]转移来的,现在的重点是如何快速的计算黑序列的第i个数之前还有多少个数没有填,...

IcePrincess_1968's World 612

Codeforces #803E: Roma and Pokers 题解

这题显然的dp 设dp[i][j]表示当前考虑到第i个位置,胜场比负场多j个能否做到,同时记录转移的坐标方便打印 因为j可能是负的,所以要加一个base 如果当前位是W:dp[i][j]=dp[i-1][j-1] 如果当前位是L:dp[i][j]=dp[i][j+1] 如果当前位是D:dp[i][j]=dp[i-1][j] 如果当前位是?:上面三种情况都考虑一遍 注意:转移的时候ab

IcePrincess_1968's World 597
上一篇: TopCoder SRM477C: KingdomTour 题解
下一篇: TopCoder SRM478C: RandomApple 题解
IcePrincess_1968
博客等级 码龄9年 13粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值