[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 );
如果a<b,ans = min( ty+x , 2 * t * x + x , (t*2-1) * x + y);
如果a=b,输出走走廊的时间。
#include<bits/stdc++.h>
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<bits/stdc++.h>
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;
}