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