B. Nastya Is Playing Computer Games---(水题模拟)Codeforces Round #546 (Div. 2)
程序员文章站
2022-06-08 16:05:53
...
Nastya Is Playing Computer Games
题目链接http://codeforces.com/contest/1136/problem/B
time limit per test:1 second
memory limit per test:256 megabytes
题目大意:给你n个盖了盖子的井和你当前的位置,井上面压着石头,井里有硬币,你需要捡完所有的硬币才能通关。问你最少的移动步数,移动规则如下:
1.将石头扔到任意一个井上。2.移动到下一个位置。3.进入井中捡硬币,并盖上盖子(这一步不会花费步数)。
emmm。。。这个读题有点有点迷,然后看了一下仔细规则——盖上井盖不用移动,而不是进入井不用移动。。。然后稍微想一想就A了。。。
对于移动,我们只有两种走法,1.往左走,走完后往右走直到底。2.往右走,走完后往左走直到底。如果不这么走,我们很容易知道他不会获得最小步数。接下来我们会发现,想要步数最小,我们应该第一步将石头放到第二步的,第二步花费多一点的步数将所有的石头放到第一步的位置,接下来的每一步就只需石头扔到已经取完的井上了。所以我们除了第一步用了2t,第二步用了4t,接下来除了回头走没有硬币的地方是1t的其余都是3t了。
最后我们将两种方案比较一下就行了。
以下是详细代码:
#include <cstdio>
int main()
{
int n,k;
scanf ("%d%d",&n,&k);
int ans=2+4;
for (int i=k-2; i>=1; i--){
ans+=3;
}
if (k<n) {
ans+=k-1;
for (int i=k+1; i<=n; i++){
ans+=3;
}
}
int sum=9999999;
sum=(sum>ans)?ans:sum;
ans=2+4;
for (int i=k+2; i<=n; i++){
ans+=3;
}
if (k>1){
ans+=n-k;
for (int i=k-1; i>=1; i--){
ans+=3;
}
}
sum=(sum>ans)?ans:sum;
printf ("%d\n",sum);
return 0;
}
上一篇: 如何应用PHP函数imagettftext处理图片_PHP教程
下一篇: php怎么进行正则匹配