金币收集问题

金币被放在1到n编号的格子中,一个人从第一个格子出发,有m张卡片,共4种,卡片上的数字1-4,表示可以走的步数。求到达终点获得的最大金币数。

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        int m=in.nextInt();
        int[] a=new int[n];
        for(int i=0;i<n;i++){
            a[i]=in.nextInt();
        }
        int[] b=new int[4];
        for(int i=0;i<4;i++){
            b[i]=in.nextInt();
        }
        Map<Integer,Integer> map=new HashMap<>();
        map.put(0,a[0]);
        int sum=0;
        for(int i=3;i>=0;i--){
            sum<<=6;
            sum+=b[i];
        }
        for(int k=1;k<=sum;k++){
            int[] step=steps(k);
            boolean flag=true;
            for(int i=0;i<4;i++){
                if(step[i]>b[i]){
                    flag=false;
                    break;
                }
            }
            if(!flag){
                continue;
            }
            int pos=calSteps(k);
            int cur=a[pos];
            int max=0;
            for(int i=0;i<4;i++){
                if(step[i]>0){
                    int oldPos=getOldPos(step,i);
                    max=Math.max(max,map.getOrDefault(oldPos,0));
                }
            }
            map.put(k,cur+max);
        }
        System.out.println(map.get(sum));
    }
    private static int getOldPos(int[] step,int j){
        int ret=0;
        for(int i=3;i>=0;i--){
            ret<<=6;
            ret+=step[i];
            if(i==j){
                ret--;
            }
        }
        return ret;
    }
    private static int[] steps(int n){
        int[] ret=new int[4];
        for(int i=0;i<4;i++){
            ret[i]=n&0x3f;
            n>>=6;
        }
        return ret;
    }
    private static int calSteps(int n){
        int ret=0;
        for(int i=0;i<4;i++){
            int x=n&0x3f;
            ret+=(i+1)*x;
            n>>=6;
        }
        return ret;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Unity中,为游戏添加吃金币音效是一种常见的增强用户体验的方法。当你设计一款游戏,当玩家角色(通常是游戏角色)成功收集金币时,通常会播放一个特定的音效来表示这一事件的发生。以下是如何在Unity中添加和使用吃金币音效的基本步骤: 1. **导入音效文件**: - 首先,你需要准备一个金币吃掉的音频文件,通常选择适合游戏风格的金币掉落或收集的音效(例如金币碰撞、金币拾取的wav或mp3格式)。 - 在Unity的Assets目录下创建一个专门的Audio Assets文件夹,将音效文件导入并存储其中。 2. **创建播放器组件**: - 在Hierarchy面板中,右键点击空处,选择Create > Audio > Audio Source,为游戏对象创建一个音频播放器组件。 3. **关联音效**: - 在创建的Audio Source组件上,找到"Clip"属性,在Inspector窗口中设置为你要使用的金币音效。 4. **脚本控制**: - 如果你想在游戏中基于代码触发音效,可以编写一个C#脚本,比如当检测到角色与金币碰撞时调用AudioSource.Play()方法播放音效。 ```csharp void OnTriggerEnter(Collider other) { if (other.CompareTag("Coin")) { AudioSource.PlayClipAtPoint(coinSound, transform.position); } } ``` 5. **设置循环**: - 如果金币被吃掉后还想持续播放,你可以设置AudioSource.loop = true;。否则,用一次性的Play方法即可。 6. **优化性能**: - 为了减少内存消耗,考虑将音效设为一次性播放,或者使用Audio Clip实例池来复用同一音效对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值