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

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

题目链接:最强的决斗者一切都是必然的!

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

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这两个数组的值,见下:

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--,跳过前面的一张卡

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • KMP(4)

    mathor
  • LeetCode52. N皇后 II

    mathor
  • TextCNN的PyTorch实现

    本文主要介绍一篇将CNN应用到NLP领域的一篇论文 Convolutional Neural Networks for Sentence Classificat...

    mathor
  • android自定义控件ImageView实现圆形图片

    android开发中常常涉及到一种情况,就是将用户上传的图片以圆形样式显示,但是用户上传的图片可以有直角、圆角、正方形等多种不确定样式,这时就用到了自定义Ima...

    砸漏
  • HDOJ 2073 无限的路

    Problem Description 甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出...

    谙忆
  • Android自定义View实现抽奖转盘

    本文实例为大家分享了Android自定义View实现抽奖转盘的具体代码,供大家参考,具体内容如下

    砸漏
  • C#构造函数里的base和this的区别

    父类的构造函数总是在子类之前执行的。既先初始化静态构造函数,后初始化子类构造函数。

    跟着阿笨一起玩NET
  • 763. Partition Labels

    思路: 很暴力,直接找可以Partition的位置,如果不能Partition,继续向后搜索直到找到第一个可以Partition的位置为止,这样剩余问题就是...

    用户1147447
  • 优雅地实现RecyclerView的上拉加载

    这篇博客是承接上一篇博客--探索Android架构的DataLayer层(DataManager方式)具体实现,其实是上篇博客的一个使用比较普遍的例子,当然如果...

    1025645
  • Listvie简单实现购物车功能

    本文实例为大家分享了Listvie简单实现购物车的具体代码,供大家参考,具体内容如下

    砸漏

扫码关注云+社区

领取腾讯云代金券