以下是HackerRank(评级中等)的问题:
当Daenerys拿到她的新手机时,里面没有游戏。所以她去了游戏商店并下载了一款名为Princess and Angels的顶级游戏。
在游戏公主中以0总强度开始。在公主和她的城堡之前有N个天使。每一位天使都给予艾力。但是有些天使实际上穿着天使服装是邪恶的,他们在试图与公主战斗时会给予负面力量。如果丹妮莉丝可以在没有死亡的情况下通过所有的N天使,那么这场比赛就可以赢得比赛。如果公主的总体力量不到0,公主就会死去。幸运的是,公主有一种特殊的力量。她可以和天使一起战斗,并且最多可以逆转它的力量。如果她用x力量对我的天使使用那种力量,她可以施加这种力量并使其成为-x。
丹妮莉丝可以预见N天使的优势。当穿过每个天使时,力量会增加到总强度。公主也可以在加入之前扭转那个天使的力量,但只有一次。
鉴于天使的N优势,你能否帮助丹妮莉斯找出她可以获得的最佳结果?
打印“她做到了!” (如果她没有引号)她可以赢得比赛。否则打印她可以到达的最大位置(即由于负的总强度而导致她死亡的位置)。
输入格式
第一行输入包含T,测试用例数。
每个测试用例都有两行,第一行是N,下一行是N空格分隔的整数。
约束
1·; = T< = 1000
1·; = N< = 100000
-1000< =&强度LT; = 1000
输出格式
对于每个测试用例,打印一行表示问题的答案。
这是我对解决方案的尝试:
#include <iostream>
using namespace std;
int main() {
int strength, power, n, t, count = 1, i, pos;
cin>>t;
while(count <= t)
{
strength = 0;
power = 1;
cin>>n;
int a[n];
for(i = 0; i < n; i++)
cin>>a[i];
for(i = 0; i < n; i++)
{
if((strength + a[i]) < 0 && power == 1)
{
strength -= a[i];
power = 0;
}
else if((strength + a[i] < 0) && power == 0)
{
if(strength >= 0)
{
pos = i + 1;
strength += a[i];
break;
}
}
else if((strength + a[i]) >= 0)
strength += a[i];
}
if(strength >= 0)
cout<<"She did it!"<<endl;
else if(strength < 0)
cout<<pos<<endl;
count++;
}
return 0;
}
答案 0 :(得分:2)
我想:
想象一下以下输入:
5
6 -5 -2 -2 -2
您的算法将遇到6
并添加它,因此力量变为6
。
接下来我们遇到-5
。由于这不会杀死我们,我们接受这种损失。力量变为1
。
接下来我们来-2
。这会杀死我们(把我们带到-1
)所以我们用力量来翻转它。我们的力量变为3
。
以下两个-2
将因此杀死我们。
但是,如果你曾使用-5
上的力量使总强度达到11
那么你就会结束,所以在这种情况下你的回答是不正确的。