又是
A
R
C
ARC
ARC,是不是我们一上课就有ARC啊!?
好了,回过正题吧
A
R
C
ARC
ARC
C
C
C题没有做出来真是可惜啊……
A
题面
给定
a
a
a,
b
b
b,
x
x
x,
y
y
y,其中
a
a
a和
b
b
b表示要从
A
A
A楼的
a
a
a楼层到
B
B
B楼的
b
b
b楼层,
x
x
x和
y
y
y见图(橘色的线是双向的),问最少需要多长时间?
思路
分情况讨论。
首先如果以折线走(
2
x
2x
2x)更好,我们就会选择
2
x
2x
2x,而不是
y
y
y。
接下来,我们开始分情况讨论。
- a>b 我们走a-b-1个楼梯,再走一个走廊。
- a=b 直接走一个y即可。
- a<b 同理,走b-a个楼梯,再走一个走廊。
代码
#include<bits/stdc++.h>
#include<algorithm>
#define int long long
using namespace std;
signed main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
//MessageBox(GetForegroundWindow(),"标题","内容",MB_YESNO);
int a,b,x,y;
cin>>a>>b>>x>>y;
int sum=0;
if(x+x<y){
y=x+x;
}
if(a>b){
sum=(a-b-1)*y;
sum+=x;
}else if(a==b){
sum=x;
}else{
sum=(b-a)*y;
sum+=x;
}
cout<<sum<<endl;
return 0;
}
B
题面
AT题面
斯努克正在拜访东京一家名为
109
109
109的商店,准备购买一些原木。
他想要
n
n
n个原木:一个长度为1,一个长度为
2
2
2,…,一个长度为
n
n
n。这家商店有
n
+
1
n+1
n+1个原木库存:一个长度为1,一个长度为
2
2
2,…,和一个长度为
n
n
n+1的圆木。这些圆木每根售价为1日元(日本货币)。买了这些原木后,他可以想砍多少次就砍多少次。也就是说,他可以得到长度为
L
1
L1
L1…的
k
k
k个对数。,
L
k
Lk
Lk来自长度为
L
L
L的对数,其中
L
L
L=
L
1
L1
L1+
⋯
⋯
⋯+
L
k
Lk
Lk。他还可以扔掉不需要的原木。斯努克想花尽可能少的钱来得到他想要的原木。
找出获得n所需的最低金额。长度为1到n的原木。
思路
第一眼看到这道题,想到的就是找规律。
不难发现,只要一段一段切,就能找到规律。
代码
#include<bits/stdc++.h>
#include<algorithm>
#define int long long
using namespace std;
signed main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
//MessageBox(GetForegroundWindow(),"标题","内容",MB_YESNO);
int n;
cin>>n;
int m=n;
for(int i=1;n+1>=i;i++){
n-=i;
m--;
}
cout<<m+1<<endl;
return 0;
}
C
题面
AT题面
由于题面过于复杂,本蒟蒻就不翻译了,大佬们看AT题面吧。
思路
R
M
Q
RMQ
RMQ。
仔细阅读题面后,想必大佬们想的都是倍增,RMQ等等,虽然本菜鸡也想到了,但比赛时间只剩15min了……
代码
#include <bits/stdc++.h>
using namespace std;
int n, k;
string s, t;
int main() {
char win[202][202];
win['R']['R']=win['R']['S']=win['S']['R']='R';
win['S']['S']=win['P']['S']=win['S']['P']='S';
win['P']['P']=win['P']['R']=win['R']['P']='P';
cin>>n>>k>>s;
while(k--) {
t=s+s;
for(int i=0;i<n;i++)
s[i]=win[t[i*2]][t[i*2+1]];
}
cout<<s[0]<<endl;
return 0;
}
总结
比赛时降智。看来还是要多练习
R
M
Q
RMQ
RMQ。
说实话,我真的没想过
A
T
AT
AT会考
R
M
Q
RMQ
RMQ。唉,wtcl,还是要多练习啊/kk
以后多刷思维题,争取拿到
C
C
C题吧