目录
E - Evil Coordinate(思维、暴力)
思路
首先如果炸弹在(0,0)或者机器人最终停在炸弹处,那么一定Impossible。
对于其他的情况,如果存在一条路径使得机器人可以不经过炸弹,那么一定存在一种方案,使得相同的方向在这个方案种是连在一起的。
于是可以直接枚举所有方向的排列,共4!个,判断每一种排列能否绕过炸弹即可。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 100005
using namespace std;
int mx,my;
int n;
char s[N];
int L,R,D,U;
char tmp[4] = {
'U','D','L','R'};
bool check(){
int stx = 0,sty = 0;
for(int i = 0;i < n;i ++){
if(stx == mx && sty == my) return false;
if(s[i] == 'U') sty ++;
if(s[i] == 'D') sty --;
if(s[i] == 'L') stx --;
if(s[i] == 'R') stx ++;
if(stx == mx && sty == my) return false;
}
return true;
}
void solve(){
L = R = D = U = 0;
scanf("%d%d",&mx,&my);
scanf("%s",s);
n = strlen(s);
for(int i = 0;i < n;i ++)
if(s[i] == 'U') U ++;
else if(s[i] == 'L') L ++;
else if(s[i] == 'R') R ++;
else if(s[i] == 'D') D ++;
sort(tmp,tmp + 4);
do{
int cnt = 0;
for(int i = 0;i < 4;i ++){
if(tmp[i] == 'U'){
for(int j = 0;j < U;j ++)
s[cnt++] = 'U';
}
else if(tmp[i] == 'D'){
for(int j = 0;j < D;j ++)
s[cnt++] = 'D';
}
else if(tmp[i] == 'L'){
for(int j = 0;j < L;j ++)
s[cnt++] = 'L';
}
else if(tmp[i] == 'R'){
for(int j = 0;j < R;j ++)
s[cnt++] = 'R';
}
}
s[cnt] = '\0';
if(check()){
printf("%s\n",s);
return;
}
}while(next_permutation(tmp,tmp + 4));
puts("Impossible");
}
int main(){
int T;scanf("%d",&T);
while(T --)
solve();
return 0;
}
F - Fireworks(概率期望、三分)
思路
假设一开始,最优解为做 x x x个烟花之后放掉,那么如果放了之后没有一个好烟花,状态又回到了初始状态,于是此时也会继续做 x x x个烟花然后放掉,于是若采取最优策略,每一次做的烟花数量是一定的。
考虑期望如何计算,令做 x x x个烟花之后放掉为一轮,那么每一轮产生好烟花的概率为 1 − ( 1 − p ) x 1-(1-p)^x 1−(1−p)x,产生好烟花的分布为几何分布,其轮数期望为 1 1 − ( 1 − p ) x \frac{1}{1-(1-p)^x} 1−(1−p)x1,由于每一轮所需时间为 x n + m xn + m xn+m,于是期望时间为 x n + m 1 − ( 1 − p ) x \frac{xn+m}{1-(1-p)^x} 1−(1−p)x

本文提供了多项算法竞赛题目的解析及代码实现,涵盖思维、暴力、概率期望、三分法、树形背包等多种算法策略。例如利用暴力枚举解决Evil Coordinate问题,通过概率计算和三分法优化Fireworks问题,以及采用树形背包思想处理Monster Hunter问题。
最低0.47元/天 解锁文章
898

被折叠的 条评论
为什么被折叠?



