疫苗小孩<每日一题>

题目链接:登录—专业IT笔试面试备考平台_牛客网​​​​​​


思路:[牛客][错题]疫苗小孩_wingaso的博客-CSDN博客

这个大佬写的非常好

我就直接照大佬写的给出说明

这里对大佬的代码解释一下

方便大家理解

说明1:

int tT = INT_MIN;//带符号的int对象的最小值,即-2147483648 (在32位编译器上) 

for(int i = 1;i <= n;i++){//从前往后操作,作用:当某天不能打疫苗时,取它前面的能打疫苗的日子
//对可以打针的位置标记,并且A[i]=1的时候标记前面A[i]=0的位置
        if(A[i] == '0') tT = i;
        T[i] = tT;
    }
int tN = INT_MAX;//带符号的int对象的最小值

for(int i = n;i;i--){//从后到前操作,作用:当某天不能打疫苗时,取它后面的能打疫苗的日子
//对可以打针的位置标记,并且A[i]=1的时候标记后面A[i]=0的位置
    if(A[i] == '0') tN = i;
    M[i] = tN;
}

说明2:

T[max(l,1ll)]//防止取的左边打针日期小于1(说明1中向左取值的数组 取天数)

M[max(l,1ll)]//防止取的左边打针日期小于1(说明1中向右取值的数组 取天数)

min(abs(T[max(l,1ll)]-l),abs(M[max(l,1ll)]-l))//取他们距i-k距离最小的天数
T[min(r,(ll)n)]//防止取的右边打针日期大于n(说明1 中 向左取值的数组 取天数)

M[min(r,(ll)n)]//防止取的右边打针日期大于n(说明1 中 向左取值的数组 取天数)
 
min(abs(T[min(r,(ll)n)]-r),abs(M[min(r,(ll)n)]-r))//取他们距i+k距离最小的天数

说明3: 

R+=max(0ll,w-(ll)q*min(abs(T[max(l,1ll)]-l),abs(M[max(l,1ll)]-l)));  // 枚举第T[i-k]和M[i-k](加上最右边的 对手速提升的最大值)

R+=max(0ll,w-(ll)q*min(abs(T[min(r,(ll)n)]-r),abs(M[min(r,(ll)n)]-r))); // 枚举第T[i+k]和M[i+k](加上最左边的 对手速提升最大值)

 代码详解:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
typedef long long ll;
int n;
char A[N];
int T[N],M[N];
int main(){
    scanf("%d",&n);
    scanf("%s",A + 1);
    ll k,w,q;
    scanf("%lld%lld%lld",&k,&w,&q);
    int tT = INT_MIN;
    for(int i = 1;i <= n;i++){//对可以打针的位置标记,并且A[i]=1的时候标记前面A[i]=0的位置
        if(A[i] == '0') tT = i;
        T[i] = tT;
    }
    int tN = INT_MAX;
    for(int i = n;i;i--){//对可以打针的位置标记,并且A[i]=1的时候标记后面A[i]=0的位置
        if(A[i] == '0') tN = i;
        M[i] = tN;
    }
    ll ans = 0;
    for(int i = 1;i <= n + 1;i ++){//遍历所有位置
        if(A[i] == '1') continue;
        ll R = 0;
        ll l = i - k,r = i + k;
        R+=max(0ll,w-(ll)q*min(abs(T[max(l,1ll)]-l),abs(M[max(l,1ll)]-l)));  // 枚举第T[i-k]和M[i-k]
        R+=max(0ll,w-(ll)q*min(abs(T[min(r,(ll)n)]-r),abs(M[min(r,(ll)n)]-r))); // 枚举第T[i+k]和M[i+k]
        ans = max(ans,R);每次取最大值
    }
    printf("%lld\n",ans);
    return 0;
}

PS:桃之夭夭,灼灼其华。

帮我优化这段代码 private Map<String, Object> boTOMap(DownloadEpidHfmCaseSevereDeathTableVO tableVO){ this.setSonList(tableVO); List<Map<String, Object>> listMap = CodeToStringUtil.dataObjectProcessing(this.getDataObjectProcessingUtilBO(Arrays.asList(tableVO), true, chinesePattern, kg)); if(CollectionUtils.isNotEmpty(listMap)){ Map<String, Object> objectMap = listMap.get(0); //疫苗 List<EpidHfmCaseSevereDeathTestTableVO> selfTestTableVOS = tableVO.getTestTableVOS().stream().filter(item -> item.getJcdx() == DetectionObjectEnum.SELF).collect(Collectors.toList()); List<EpidHfmCaseSevereDeathTestTableVO> familyMembersTestTableVOS = tableVO.getTestTableVOS().stream().filter(item -> item.getJcdx() == DetectionObjectEnum.FAMILY_MEMBERS).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(selfTestTableVOS)){ objectMap.put("selfTestTable", this.testTableToMap(selfTestTableVOS)); } if(CollectionUtils.isNotEmpty(familyMembersTestTableVOS)){ objectMap.put("familyMembersTestTable", this.testTableToMap(familyMembersTestTableVOS)); } if(CollectionUtils.isNotEmpty(tableVO.getVaccinateTableVOS())){ objectMap.put("vaccinateTable", this.vaccinateTableToMap(tableVO.getVaccinateTableVOS())); } List<Map<String, Object>> dateList = epidHfmCaseSevereDeathComplicationTableDao.getComplicationTableDateList1(tableVO.getId()); dateList.addAll(epidHfmCaseSevereDeathComplicationTableDao.getComplicationTableDateList2(tableVO.getId(), 7-dateList.size())); if(dateList.size() < 7){ int size = dateList.size(); for (int i = 0; i < (7-size); i++) { Map<String, Object> m = new HashMap<>(); m.put("date", "-"); dateList.add(m); } } objectMap.put("titleList", dateList); if(CollectionUtils.isNotEmpty(tableVO.getComplicationTableVOS())){ List<Map<String, Object>> complicationList = null; Map<ComplicationTypeEnum, List<EpidHfmCaseSevereDeathComplicationTableVO>> listMap1 = tableVO.getComplicationTableVOS().stream().collect(Collectors.groupingBy(EpidHfmCaseSevereDeathComplicationTableVO::getType)); int num = 0; for (int j = 0; j < ComplicationTypeEnum.values().length; j++) { complicationList = new ArrayList<>(); List<Map<String, Object>> bfzmcList = epidHfmCaseSevereDeathComplicationTableDao.getComplicationTableBfzmcList( ComplicationTypeEnum.values()[j], tableVO.getId()); for (Map<String, Object> bfzmc : bfzmcList) { Map<String, Object> complication = new HashMap<>(); complication.put("bfzmc7", bfzmc.get("bfzmc")); for (int i = 0; i < dateList.size(); i++) { num = 0; for (EpidHfmCaseSevereDeathComplicationTableVO complicationTableVO : listMap1.get(ComplicationTypeEnum.values()[j])) { if(complicationTableVO.getDate().equals(dateList.get(i).get("title")) && complicationTableVO.getBfzmc().equals(bfzmc.get("bfzmc"))){ complication.put("bfzmc"+i, StringUtils.isNotBlank(complicationTableVO.getJg()) ? complicationTableVO.getJg() : ""); num = 1; break; } } if(num == 0){ complication.put("bfzmc"+i, ""); } } complicationList.add(complication); } objectMap.put("complicationType"+j, complicationList); } } return objectMap; } return null; }
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CTGU-Yoghurt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值