luoguP1167刷题

在810开出我的首发题解

luogu上也交了这篇题解(来自重构过代码的老萌新)

 —————————————————————————————————

 需要注意的几点:

 1.闰平年问题 (可以设计一个函数)

 2.总时间以分钟为单位

因为数据范围是从0000年到9999年的,这就意味着数值已经膨胀到int已经装不下啦!!!(老萌新我血与泪的教训)

 unsigned long long 是完全可以的

 3.存储比赛时间

 完全可以加一个字符(char)用来存放中间的符号(:和-),其余的用int就可以存下了(详见代码)

4.输入的题目时间排序

 单纯的贪心思想,时间越少先做,做一个加一

 蒟蒻统计时间的思路

 有样例好说话:(例2018-03-21-03:00 2020-09-08-12:00)

步骤

1.先把结尾年忽略,统计前面的部分(如样例就只先统计2018年2019年两个完整的年份),这样就是几个365,366相加的问题。

 2.接下来就是加上后面的(2020年的)时间,这应该好算多了吧,单纯加上八个月和九月的8天12小时(全部化为分钟,就是×24,×60的问题)

 3.最后就是减去开始(2018年)比赛所没有经历的前两个月零多少天等等的分钟数(与第2步思路近似,差别就是求出的这块时间是需要减掉的 _(ÒωÓ๑ゝ∠)__)

 (ps:以上用unsigned long long 存储收据完全可以)

 一个sort()解决其它一切问题。。。

郑重的贴上饱含n次提交的AC代码
 
 

#include<bits/stdc++.h>
using namespace std;
unsigned long long  a[5001];
int b[13]={0,0,31,59,90,120,151,181,212,243,273,304,334};
int ass(int p)
{
    if(p%400==0){return 5;}
    else if(p%100!=0&&p%4==0){return 5;}
    else {return 7;}
}
int main()
{
    int n;cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n);
    int y,m,d,h,min;char s;
    int y1,m1,d1,h1,min1;
    cin>>y>>s>>m>>s>>d>>s>>h>>s>>min;
    cin>>y1>>s>>m1>>s>>d1>>s>>h1>>s>>min1;
    unsigned long long x=0,x1=y1-y;
    for(int i=0;i<x1;i++)
    {
        x+=365;
        if(ass(y+i)==5){x++;}
    }
    x=x*24*60;
    //cout<<x<<endl;
    unsigned long long x3=(b[m1]+d1-1)*24*60+h1*60+min1;
    if(m1>2&&ass(m1)==5){x3+=1;}
    x+=x3;
    //cout<<x<<endl;
    
    x3=(b[m]+d-1)*24*60+h*60+min;
    if(m>2&&ass(m)==5){x3+=1;}
    x-=x3;
    //cout<<x<<endl;
    
    int u=0;
    for(int i=0;i<n;i++)
    {
        //cout<<"x="<<x<<endl;
        //cout<<"a[i]="<<a[i]<<endl;
        if(a[i]<=x){u++;x-=a[i];}
        else{break;}
    }
    cout<<u<<endl;
    return 0;
}


——————————————————8.10祝我生日快乐❤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\],对于问题P7114 \[NOIP2020\] 字符串匹配,我们可以使用枚举的方法来确定AB的可能情况,并进一步确定C的可能情况。假设枚举的AB是前缀iii,那么C只可能是后缀i+1i+1i+1,以及后缀i+1i+1i+1去掉前面的若干AB后得到的后缀。我们可以预处理出每个前缀和后缀中出现奇数次字符的个数。根据观察,对于AB循环奇数次和偶数次来说,它们的C的上述值分别相同。因此,我们可以分别考虑AB循环奇数次和偶数次的情况,从前往后记录当前有多少个前缀的出现奇数次字符个数为i。在询问时,我们可以直接暴力询问前缀和,总的复杂度大约是O(26n)。如果使用树状数组,复杂度可以优化到O(nlog26)。 根据引用\[2\],这个问题与周期串有关。朴素的KMP算法只能求出一个周期串的最小循环节,对于本题来说是不够的。我们需要知道对于一个AB来说,它最多能往后循环多少次。虽然可以使用二分法来解决,但是复杂度较高。 根据引用\[3\],我们可以优化复杂度。由于postodd每次只变化1,我们可以记录从i变化到i+1或者i-1时,A串满足条件的个数的变化情况。对于奇数k,没有什么特殊的情况。对于偶数k,我们注意到C串的奇偶性与整串一致,因此可以直接使用整串的奇偶性即可。 综上所述,对于问题P7114 \[NOIP2020\] 字符串匹配,我们可以使用枚举的方法来确定AB的可能情况,并根据不同情况进行处理。可以使用树状数组来优化复杂度。 #### 引用[.reference_title] - *1* *2* [【LuoguP7114】[NOIP2020] 字符串匹配 (扩展KMP算法)](https://blog.csdn.net/element_hero/article/details/113036427)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [P7114 [NOIP2020] 字符串匹配](https://blog.csdn.net/beneath_haruhi/article/details/120634165)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值