欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

B. Nastya Is Playing Computer Games---(水题模拟)Codeforces Round #546 (Div. 2)
B. Nastya Is Playing Computer Games---(水题模拟)Codeforces Round #546 (Div. 2)
B. Nastya Is Playing Computer Games---(水题模拟)Codeforces Round #546 (Div. 2)
B. Nastya Is Playing Computer Games---(水题模拟)Codeforces Round #546 (Div. 2)


题目大意:给你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;
}