前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2018年全国多校算法寒假训练营练习比赛(第一场)最强的决斗者一切都是必然的!

2018年全国多校算法寒假训练营练习比赛(第一场)最强的决斗者一切都是必然的!

作者头像
mathor
发布2018-07-24 15:35:07
3450
发布2018-07-24 15:35:07
举报
文章被收录于专栏:mathor
题目链接:最强的决斗者一切都是必然的!

 这道题还是比较好做的,首先找到哪些牌是在同一个连锁内,记录有多少组连锁,然后在从后往前枚举这些卡的效果,因为题目说了后出的牌先发动效果

代码语言:javascript
复制
import java.util.Scanner;
class card {
    public int s;//牌的速度
    public int t;//牌的效果
    public int x;//造成的伤害
}
public class Main {
    static card[] c = new card[1002];//声明对象数组
    public static int[] lian = new int[1002];//连锁
    public static int[] tail = new int[1002];
    public static int sum = 0;
    public static void main(String[] args) {
        int n;
        Scanner cin = new Scanner(System.in);
        while(cin.hasNext()) {
            n = cin.nextInt();
            for(int i = 1;i <= n;i++) {
                c[i] = new card();
                c[i].s = cin.nextInt();
                c[i].t = cin.nextInt();
                if(c[i].t == 1 || c[i].t == 2) 
                    c[i].x = cin.nextInt();
            }
            lian[1] = 1;
            int ans = 0;//记录有多少组连锁
            for(int i = 2;i <= n;i++) {
                if(c[i].s >= c[i - 1].s)
                    lian[i] = lian[i - 1] + 1;//连锁编号加加
                else {
                    lian[i] = 1;
                    tail[ans] = i - 1;
                    ans++;
                }
            }
            tail[ans] = n;
            int sum = 0;
            for(int i = 0;i <= ans;i++) {
                for(int j = tail[i];j > tail[i] - lian[tail[i]];j--) {
                    if(c[j].t == 1)sum += c[j].x;
                    if(c[j].t == 2)sum += c[j].x * lian[j];
                    if(c[j].t == 3)break;
                    if(c[j].t == 4)j--;
                }
            }
            System.out.println(sum);
        }
    }
}

 ans记录的是有多少组连锁,方便后面计算的时候进行循环,lian[i]表示第i张卡在其自己所属的连锁内的连锁编号,比方说样例中的3 3,对应的数组就是lian[8] = 2,tail[i]表示的是第i组连锁的最大下标值,对于样例来说,tail[0]=4,tail[1]=6,tail[2]=9,针对样例,我写了个tail和lian这两个数组的值,见下:

代码语言:javascript
复制
9
1 1 300  lian[1] = 1 ans = 0
2 2 400  lian[2] = 2 ans = 0
2 3      lian[3] = 3 ans = 0
2 2 500  lian[4] = 4 ans = 0
1 1 1000 lian[5] = 1 tail[0] = 4 ans = 1
3 4      lian[6] = 2 ans = 1
2 1 600  lian[7] = 1 tail[1] = 6 ans = 2
3 3      lian[8] = 2 ans = 2
3 4      lian[9] = 3 tail[2] = 9

 如果效果是3,那就直接break,这一连锁里的所有卡都不用看了,效果全部无效了;如果效果是4,直接j--,跳过前面的一张卡

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目链接:最强的决斗者一切都是必然的!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档