- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在练习 hackerearth 的问题时,我遇到了以下问题(不是来自 active contest )并且在多次尝试后都没有成功。
Chandler is participating in a race competition involving N track races. He wants to run his old car on these tracks having F amount of initial fuel. At the end of each race, Chandler spends si fuel and gains some money using which he adds ei amount of fuel to his car.
Also for participating in race i at any stage, Chandler should have more than si amount of fuel. Also he can participate in race i once. Help Chandler in maximizing the number of races he can take part in if he has a choice to participate in the given races in any order.
我该如何解决这个问题。我的方法是按 (ei-si)
排序,但我无法合并当前燃料大于比赛所需的条件。
编辑 我尝试使用以下算法解决但它失败了,我也想不出任何使算法失败的输入。请帮我找出问题所在,或者在我的算法失败时提供一些意见。
Sort (ei-si) in non-increasing order;
start iterating through sorted (ei-si) and find first element such that fuel>=si
update fuel=fuel+(ei-si);
update count;
erase that element from list, and start searching again;
if fuel was not updated than we can't take part in any races so stop searching
and output count.
编辑 这是我要求的代码。
#include<iostream>
#include<vector>
#include<algorithm>
#include<list>
using namespace std;
struct race{
int ei;
int si;
int earn;
};
bool compareByEarn(const race &a, const race &b)
{
return a.earn <= b.earn;
}
int main(){
int t;
cin>>t;
while(t--){
vector<struct race> fuel;
int f,n;
cin>>f>>n;
int si,ei;
while(n--){
cin>>si>>ei;
fuel.push_back({ei,si,ei-si});
}
sort(fuel.begin(),fuel.end(),compareByEarn);
list<struct race> temp;
std::copy( fuel.rbegin(), fuel.rend(), std::back_inserter(temp ) );
int count=0;
while(1){
int flag=0;
for (list<struct race>::iterator ci = temp.begin(); ci != temp.end(); ++ci){
if(ci->si<=f){
f+=ci->earn;
ci=temp.erase(ci);
++count;
flag=1;
break;
}
}
if(!flag){
break;
}
}
cout<<count<<endl;
}
}
编辑 正如下面的回答所述,上述贪婪方法并不总是有效。所以现在任何替代方法都会有用
最佳答案
这是我的解决方案,已被法官接受:
很明显,您淘汰有利可图的比赛的顺序并不重要。 (只要您处理它们,直到无法进入更多有利可图的比赛。)
剩下的,我先证明,如果存在解,你可以按照ei递减的顺序进行同样的一组比赛,解仍然是可行的。想象一下,我们有一个解决方案,其中选择了 k 场比赛,假设这 k 场比赛的开始和结束燃料值为 s1,...,sk 和 e1,...,ek。让 i 成为第一个索引,其中 ei < ej(其中 j=i+1)。我们将证明我们可以在不违反任何约束的情况下交换 i 和 i+1。
很明显,交换 i 和 i+1 不会破坏 i 之前或 i+1 之后的任何约束,所以我们只需要证明如果我们将其顺序与比赛 i+1 交换,我们仍然可以执行比赛 i ( j).按照正常的顺序,如果我们在第 i 场比赛开始之前的燃油水平是 f,那么在第 i 场比赛之后它将是 f-si+ei,这至少是 sj。也就是说,我们有:f-si+ei>=sj,即f-sj+ei>=si。然而,我们知道 ei < ej 所以 f-sj+ej >= f-sj+ei >= si,因此在第 i 场比赛之前的第 j 场比赛仍然会为第 i 场比赛留下至少 si 燃料。
从那里,我们实现了一个动态规划算法,其中 d[i][j] 是我们可以参加的最大比赛数量,如果我们只能使用比赛 i..n 并且我们从 j 单位燃料开始。
这是我的代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 110;
const int maxf = 110*1000;
int d[maxn][maxf];
struct Race {
int s, e;
bool used;
inline bool operator < (const Race &o) const {
return e > o.e;
}
} race[maxn];
int main() {
int t;
for (cin >> t; t--;) {
memset(d, 0, sizeof d);
int f, n;
cin >> f >> n;
for (int i = 0; i < n; i++) {
cin >> race[i].s >> race[i].e;
race[i].used = false;
}
sort(race, race + n);
int count = 0;
bool found;
do {
found = 0;
for (int i = 0; i < n; i++)
if (!race[i].used && race[i].e >= race[i].s && race[i].s >= f) {
race[i].used = true;
count++;
f += race[i].s - race[i].e;
found = true;
}
} while (found);
for (int i = n - 1; i >= 0; i--) {
for (int j = 0; j < maxf; j++) {
d[i][j] = d[i + 1][j];
if (!race[i].used && j >= race[i].s) {
int f2 = j - race[i].s + race[i].e;
if (f2 < maxf)
d[i][j] = max(d[i][j], 1 + d[i + 1][f2]);
}
}
}
cout << d[0][f] + count << endl;
}
return 0;
}
关于algorithm - 竞赛挑战 : "Maximize number of races one can take part in",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23902269/
我经常发现这些术语被用在并发编程的上下文中。它们是相同的还是不同的? 最佳答案 不,它们不是同一件事。它们不是彼此的子集。它们也不是彼此的必要条件,也不是充分条件。 数据竞争的定义非常明确,因此,它的
我在测试我的项目时遇到了 DATA RACE 警告,想知道是否有人愿意帮助我破译这个问题。我过去从未尝试过测试 go 例程,我发现很难全神贯注于数据竞赛。 我在描述中提供了指向未解决问题的链接,并在问
起初,我知道代码有一些竞争条件,所以我使用“go build -race”命令来检查它,我想看看结果如何显示,当我第一次运行时,它显示了第一个结果如下,然后再次运行显示第二个,它有两个不同的结果,我不
我在考虑我的代码中的极端情况,我不知道如何在检查文件是否存在时避免问题,如果不存在,则创建一个具有该文件名的文件。代码大致如下所示: // 1 status = stat(filename); if
我在考虑我的代码中的极端情况,我不知道如何在检查文件是否存在时避免问题,如果不存在,则创建一个具有该文件名的文件。代码大致如下所示: // 1 status = stat(filename); if
我想知道是否存在插入查询上实际发生竞争条件问题的真实案例。所以我有一个包含以下字段的“用户”表: User: iduser | idcompany | name | email 我为此表使用复合主键(
我有一段代码(一个测试运行器)应该运行代码并返回结果,我想为每个测试用例设置一个时间限制所以我使用 Promise.race 但不幸的是它不起作用 const createTestCafe = req
我遇到了 an implementation JavaScript 中的 Promise.race() 方法,它按预期工作,但对我来说意义不大。 const race = (...promises)
我的测试代码如下,使用threading,count不是5,000,000,所以出现data race,但是使用gevent,count是5,000,000,没有data race。 难道gevent
据我所知,关于promise有两个选项: promise.all() promise.race() 好的,我知道 promise.all() 是做什么的。它并行运行 Promise,如果两者都成功解析
又是我和我的BlockingQueue...我根据this article重写了它和 this question .它发送了一些项目,然后因访问冲突而崩溃。这是代码: template bool D
所以我有两个Python3.2进程需要相互通信。大多数需要交流的信息都是标准词典。命名管道似乎是可行的方法,所以我制作了一个可以在两个进程中实例化的管道类。这个类实现了一个非常基本的协议(protoc
我有一个注册页面,它接收 token 并解析它们并在参数适用时登录用户。 在我检查 token 的时间到我从数据库中删除 token 的时间之间,另一个用户可以使用相同的 token 登录。有没有办法
我在 redis 中有一个散列,其中一个字段的值为字符串化数组,每当用户注册一个事件时, 从redis中获取这个字符串化数组 后台解析,将用户的用户名添加到数组中 将数组字符串化并存储回哈希 如果两个
我知道之前有人问过这个问题,但我仍然很困惑,如果可能的话,我想在开始编程之前避免任何问题。 我计划拥有一个在任何给定时间至少有 100 名活跃用户的内部网站。用户将发布一个项目(以 0 作为其值插入到
我在面试中被问到以下问题。给定以下代码,如果方法 add 和 doAction 被多个线程调用,我们如何在打印 toString 时得到 NullPointerException ?** public
为什么标志“-race”的结果与预期的不一样?它期望相同的结果:1000000 - 带有标志“-race”但没有这个 https://gist.github.com/romanitalian/f403
我正在尝试了解如何为以下代码修复此竞争条件。 sayHello := func() { fmt.Println("Hello from goroutine") } go sayHello()
我有一堆 goroutines 在循环中做一些事情。我希望能够暂停所有这些,运行一些任意代码,然后恢复它们。我尝试这样做的方式可能不是惯用的(我希望有更好的解决方案),但我不明白为什么它不起作用。 精
考虑一个实现 open()、read()、write()、close()、unlocked_ioctl() 和 mmap() 的 linux 设备驱动程序。 现在,假设多个(或相同的)进程同时打开同一
我是一名优秀的程序员,十分优秀!