2020ICPC南京【个人题解EFHKLM】

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

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(1p)x,产生好烟花的分布为几何分布,其轮数期望为 1 1 − ( 1 − p ) x \frac{1}{1-(1-p)^x} 1(1p)x1,由于每一轮所需时间为 x n + m xn + m xn+m,于是期望时间为 x n + m 1 − ( 1 − p ) x \frac{xn+m}{1-(1-p)^x} 1(1p)x

### 关于2024 ICPC在线竞赛题目解答 对于希望获取2024年国际大学生程序设计竞赛(ICPC)网络赛题目的解答或解析,通常这类资源会在比赛结束后一段时间内由官方或其他社区成员发布。目前可利用多个平台来跟踪最新动态并参与讨论。 #### 官方渠道与社区支持 - **ICPC官方网站**:这是最权威的信息源,会公布正式的比赛结果以及可能发布的标准解法[^1]。 #### 社区贡献的解决方案 许多编程爱好者和参赛者会在赛后分享自己的思路和技术细节。可以关注以下几个活跃的技术交流网站: - **Codeforces博客板块**:这里经常有经验丰富的选手撰写详细的赛后分析文章[^3]。 - **TopCoder论坛**:尽管主要服务于自家赛事,但也涵盖了广泛的算法话题,包括对其他公开赛事的看法。 - **LeetCode Discuss**:除了日常刷题外,该区域也适合探讨各类竞赛中的难题。 #### 自学准备建议 为了更好地理解未来可能出现的标准答案,在等待期间可以通过研究过往相似类型的题目来进行预习。例如,通过访问A2 Online Judge、SPOJ等站点上的动态规划(DP)分类练习,有助于积累解决复杂问题的经验。 ```python # 示例:如何在Python中实现一个简单的动态规划求斐波那契数列函数 def fibonacci(n, memo={}): if n in memo: return memo[n] elif n <= 2: result = 1 else: result = fibonacci(n-1, memo) + fibonacci(n-2, memo) memo[n] = result return result ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值