[AtCoder] AtCoder Regular Contest 109 A - Hands B - log题解

[AtCoder] AtCoder Regular Contest 109

状态很差 敲了两题就不想读题了

A - Hands
题意:B楼的 i 层可以用走廊连接A楼的i层和 i-1 层,楼梯连接本楼上下临接的两层,走走廊需要x时间,走楼梯需要y时间,问从A楼的a层走到B楼的b层,需要花费的最小时间。

简单的分类讨论:
如果a>b, ans = min( (t2-1) * x, (t-1) * y + x );
如果ay+x , 2 * t * x + x , (t*2-1) * x + y);
如果a=b,输出走走廊的时间。

#include
using namespace std;
#define ll long long

int MIN(int a,int b,int c)
{
	int m = min(a,b);
	m = min(m,c);
	return m;
}

int main()
{
	int a,b,x,y;
	cin>>a>>b>>x>>y;
	int t = 2*x;
	if(a==b)
	{
		cout<<x<<endl;
		return 0;
	}
	if(b<a)
	{
		int t = a-b;
		cout<<min((t*2-1)*x,(t-1)*y+x);
	}
	else 
	{
		int t = b-a;
		cout<<MIN(t*y+x,2*t*x+x,(t*2-1)*x+y);
	}
	return 0;
} 

B - log
题意: 需要n个木头,长度是1-n。给你长度为1-n+1的n+1个木头,你可以任意切割这n+1块木头,问最少需要多少个木头。

不难发现,如果没有这一块n+1长度的木头,就一定需要n块木头,也就是我们需要用这n+1长度的木头切出最多的不同长度的木头。
用贪心的思想做,尽可能的将这块木头切出从1开始自然增长的木头;
比如 n = 6的时候 我需要从{1,2,3,4,5,6,7}块木头中得到{1,2,3,4,5,6}长度的6块木头,我将长度为7的木头切割成{1,2,3},最少需要1+n - 3= 4块木头。

#include
using namespace std;
#define ll long long 

int main()
{
	ll n;
	cin>>n;
	ll x = 0;
	for(ll i=1;i<=n;i++)
	{
		if((i+1)*i/2<=(n+1)&&(i+2)*(i+1)/2>n+1)
		{
			x = i;
			break;
		}
	}
	cout<<n-x+1<<endl;
	return 0;
}

你可能感兴趣的:(算法,acm竞赛,c++)