50pts:
可能是辅助数组 sy,sn 的更新方式出现问题,也可能你只打了 50pts 的部分分,比如:
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define rop(i, j, k) for(int i = j; i >= k; i--)
rep(i, 1, m){
int cnt = 0;
rep(j, 1, n){
if(a[j][i].ch == 'Y') sy[i][cnt] += a[j][i].val;
else{
cnt++;
sy[i][cnt] = sy[i][cnt - 1] + a[j][i].val;
sn[i][cnt] = sy[i][cnt - 1] + a[j][i].val;
}
}
}
但是我们是从下面开始打砖块的,所以 j 应该从 n 到 1 枚举。
70pts:没有考虑 Y 和 N 的打法,遇见 Y 可能就直接打了,数据:
hack 数据 from here
3 2 4
2 Y 1 Y
1 N 1 N
1 N 1 N
6
80pts:辅助数组 sy,sn 的更新方式出现问题,如:
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define rop(i, j, k) for(int i = j; i >= k; i--)
rep(i, 1, m){
int cnt = 0;
rop(j, n, 1){
if(a[j][i].ch == 'Y') sy[i][cnt] += a[j][i].val;
else{
cnt++;
sy[i][cnt] = sy[i][cnt - 1] + a[j][i].val;
sn[i][cnt] = sn[i][cnt - 1] + a[j][i].val;
}
}
}
sn 数组记录的是打最后一颗,所以只能从不是打最后一颗的 sy 数组转移,所以改为:sn[i][cnt] = sy[i][cnt - 1] + a[j][i].val;
即可。
hack 数据 from here
3 3 3
1 Y 1 Y 1 Y
1 N 1 N 1 N
1 Y 1 Y 1 Y
8