C - Road To Zero

C - Road To Zero

在这里插入图片描述

Note

In the first test case you can perform the following sequence of operations: first, second, first. This way you spend 391+555+391=1337391+555+391=1337 dollars.
In the second test case both integers are equal to zero initially, so you dont’ have to spend money.

题意

给出两个整数x,y按步骤同时为零,一种花费a元x或y一者加减一,第二种花费b元同时加减一

思路

x,y之间差一定需要第一种消除消除之后比较2*a和b的大小决定方法。

代码

#include>
#include
using namespace std;
int main(){
int t;
cin>>t;
while(t–){
long long a,b,x,y,minab,minxy;
cin>>x>>y;
cin>>a>>b;
minab=b;
if(2a<b)minab=2a;
minxy=x;
if(x>y)minxy=y;
cout<<abs(x-y)a+minabminxy<<endl;
}
}

1、该资源内项目代码经过严格调试,下载即用确保可以运行! 2、该资源适合计算机相关专业(如计科、人工智能、大数据、数学、电子信息等)正在做课程设计、期末大作业和毕设项目的学生、或者相关技术学习者作为学习资料参考使用。 3、该资源包括全部源码,需要具备一定基础才能看懂并调试代码。 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip
以下是使用分支界限法解决该问题的C++代码: ```c++ #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int N = 1010, M = 20010; int n, m, c, s, e; int p[N], h[N], e[M], ne[M], w[M], idx; int dist[N][110]; // dist[i][j]表示从起点到i,油量为j时的最短路 bool st[N][110]; struct Node { int u, d, c; bool operator< (const Node& t) const { return d > t.d; } }; void add(int a, int b, int c) { e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++; } int dijkstra() { memset(dist, 0x3f, sizeof dist); priority_queue<Node> heap; heap.push({s, 0, 0}); dist[s][0] = 0; while (heap.size()) { auto t = heap.top(); heap.pop(); int u = t.u, d = t.d, c = t.c; if (st[u][c]) continue; st[u][c] = true; for (int i = h[u]; ~i; i = ne[i]) { int j = e[i], v = w[i]; if (c + j <= c && dist[j][c + j] > dist[u][c] + p[j] * (c + j - d)) { dist[j][c + j] = dist[u][c] + p[j] * (c + j - d); heap.push({j, dist[j][c + j], c + j}); } } } int res = 0x3f3f3f3f; for (int i = 0; i <= c; i ++ ) res = min(res, dist[e][i]); if (res == 0x3f3f3f3f) return -1; return res; } int main() { scanf("%d%d", &n, &m); for (int i = 0; i < n; i ++ ) scanf("%d", &p[i]); memset(h, -1, sizeof h); while (m -- ) { int a, b, c; scanf("%d%d%d", &a, &b, &c); add(a, b, c), add(b, a, c); } scanf("%d%d%d", &c, &s, &e); int res = dijkstra(); if (res == -1) puts("impossible"); else printf("%d\n", res); return 0; } ``` 思路解析: - 由于题目要求求最优解,因此我们可以想到使用单源最短路径算法来求解,这里我们采用Dijkstra算法。 - 由于油量对于最短路的计算有影响,因此我们可以使用二维数组`dist[i][j]`来表示从起点到i,油量为j时的最短路。 - 在Dijkstra算法中,每次从堆中取出距离起点最近的节点`u`,在遍历`u`的邻居节点`v`时,我们需要考虑两种情况:(1)当前油量`c`可以到达节点`v`,则直接更新`dist[v][c]`;(2)当前油量`c`无法到达节点`v`,则需要选择一个新的油量`c'`来到达节点`v`,那么节点`v`的油量将变为`c' - dis(u, v)`,因此我们可以将更新`dist[v][c']`的过程转化为更新`dist[v][c]`的过程,即`dist[v][c'] = dist[u][c] + p[v] * (c' - dis(u, v))`,其中`p[v]`表示节点`v`的油价。 - 由于油量是一个连续的值,因此我们需要使用bool数组`st[i][j]`来标记节点`i`的油量是否被访问过,防止重复访问。 - 最后,我们在`dist[e][i]`中取最小值即为答案。 时间复杂度:$O(mc\log n)$ 其中,$m$为边数,$c$为油量,$n$为点数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值