图片说明
签到中的签到题

A:传送门:https://ac.nowcoder.com/acm/contest/5278/A

思路:用一个数组a[4]存放四位选手的分数,然后先做一个排序,首尾组合,中间两个组合即可,然后相减,结果加绝对值,因为可能减下来为负数(在这里竟然WA了一下,orz)。

#include<bits/stdc++.h>
using namespace std;
int main(){
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    int a[4];
    cin>>a[0]>>a[1]>>a[2]>>a[3];
    sort(a,a+4);
    int ans=(a[0]+a[3])-(a[1]+a[2]);
    ans=abs(ans);
    cout<<ans<<endl;
    return 0;
}

B:传送门:https://ac.nowcoder.com/acm/contest/5278/B

图片说明
思路:对输入的数据逐步筛选,然后对满足的根据要求进行排序,然后输出即可,用结构体存储数据

#include<bits/stdc++.h>
using namespace std;
struct node{
    int data;
    int number;
    double temp;
}Node[120];
bool cmp(node a,node b){
    if(a.data!=b.data)  return a.data>b.data;
    else if(a.temp!=b.temp)  return a.temp>b.temp;
    else  return a.number<b.number;
}
int main(){
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    int n;
    scanf("%d",&n);
    int ans=0;
    for(int i=0;i<n;i++){
        scanf("%d%d%lf",&Node[i].data,&Node[i].number,&Node[i].temp);
        if(Node[i].temp>=38.0)  ans++;
    }
    sort(Node,Node+n,cmp);
    cout<<ans<<endl;
    for(int i=0;i<n;i++){
        if(Node[i].temp>=38.0){
            printf("%d %d %.1lf\n",Node[i].data,Node[i].number,Node[i].temp);
        }
    }
    return 0;
}

C:传送门:https://ac.nowcoder.com/acm/contest/5278/C

图片说明
纸老虎题,本以为要用DP解,看来是我想多了。
思路:如果两字串的长度不一样的话,输出更长的那个字符串的长度,如果是一样的话,那么除非他们两是完全一样的字符串(是就输出-1),否则任意输出其中一个的长度即可。

#include<bits/stdc++.h>
using namespace std;
int main(){
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    string a,b;
    cin>>a>>b;
    if(a==b)  cout<<"-1"<<endl;
    else{
        int len1=a.length(),len2=b.length();
        if(len1>len2)  cout<<len1<<endl;
        else  cout<<len2<<endl;
    }
    return 0;
}

D:传送门:https://ac.nowcoder.com/acm/contest/5278/D

图片说明
思路:从小到大开始找,如果n=1,输出0或1,如果是2,输出0 11,这两个要特判,然后从3开始,输出0 11 101,n=4:0 11 101 1001,依次类推,就是两端为1,中间补相应个0即可,也可反过来。这么做的原因主要是题目说了,从头部和尾部删除一些字符就算是字串,那么我就从中间添加即可避免产生字串
特别注意2也要进行特判,又在这被坑了两次,orz

#include<bits/stdc++.h>
using namespace std;
int main(){
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    int n;
    cin>>n;
    if(n==1){
        cout<<"1"<<endl;
        cout<<"1"<<endl;
    }
    else if(n==2){
        cout<<"2"<<endl;
        cout<<"1"<<endl;
        cout<<"00"<<endl;
    }
    else{
        int k=n-1;
        cout<<k<<endl;
        for(int j=2;j<=n;j++){
            for(int i=1;i<=j;i++){
                if(i==1||i==j)  cout<<"1";
                else  cout<<"0";
            }
            cout<<endl;
        }
    }
    return 0;
}

E:传送门:https://ac.nowcoder.com/acm/contest/5278/E

图片说明
思路:吃到的那一轮还剩多少就减去相应的美味度,先计算总的美味度,然后减去损失的美味度即可。如对于n,吃n轮,第二轮开始减,第二轮少n-1,第三轮少n-2,第四轮少n-3,第n轮少1,然后就是1,2,3...n-1的前n-1项求和就行了,最后用总的减去少了的即可,但用这种方法要注意开long long。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100010];
int main(){
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    ll n;
    cin>>n;
    ll ans=0;
    for(int i=0;i<n;i++){
        cin>>a[i];
        ans+=a[i];
    }
    ll temp=(n-1)*n/2;
    ans=ans-temp;
    cout<<ans<<endl;
    return 0;
}

F:传送门:https://ac.nowcoder.com/acm/contest/5278/F

图片说明
两种方法,第一种打表,当然,这是没办法中的办法。我今天主要介绍第二种方法,也是常规方法。
对于在范围内的数据,我们最最想要的就是如何确定一年中的父亲节和母亲节。那么,如何做呢?
首先,我们要明白,闰年是可以被4不能被100整除,能被400整除的。
我们以母亲节为例:2000年母亲节在5.14,那么2001年的我们如何求呢?我们知道,2000-2001的母亲节之间相差365天,(这个要根据平年和闰年来计算,平年365,闰年366)而365%7==1,那么我们就可以知道,如果两年的节日之间相差365,天数就是在前一年的基础上提前一天,如果是366,那么天数就往前提前两天。然后因为是以星期为标准,那么就有一个周期为7。
然后我们又观察发现,母亲节的日期总是在8-14范围内的,父亲节的日期总是在21-15内的。我们就能得到这两个式子:mo=14-((y-2000)+(y-2000)/4)%7;(y-2000)表示的是要提前几天,而(y-2000)/4是指出现了几个闰年,就是要多提前几天。fa=21-((y-1998)+(y-2000)/4+1)%7;然后,我们会发现,父亲节的日期和母亲节的日期表达式是不一样的,原因就是2000年恰好是我们母亲节的日期周期的开始,而父亲节周期的开始要从1998年算起,(1998父亲节的日期是21号,然后逐年减)这样,我们就得从1998年算起,这个加1主要是考虑了2000年的,然后还得分平年和闰年来计算即可。

接下来,还要再讨论2100年的情况了,至于为什么会想到要特判这个年份,WA多了自然要考虑到边界的情况。如果我们输入的情况的答案可能在2101年的父亲或母亲节的话,那么我们那个式子就会有错,说到底,还是我们那个式子有取巧的地方,我们没有区分可被4整除而不能被100整除的,而2100恰好就是可以被4整除,而能被100整除,2100年不是闰年。我们之所以可以用那个式子的原因就是在2000-2100年内除了2100年,能被4整除的年份都是闰年,如果范围大了就不好说了。然后经过计算我们可以知道2100年的父亲节日期为21,母亲节为9.
讨论完这些特殊的情况之后,我们终于可以开始讨论单独一年的情况了。
在一年中,我们先计算出这一年的父亲节和母亲节。假如是月份为1-4,然后,输出的节日肯定是母亲节;假如是5月份,如果输入的d(输入的日子)<mo,那么肯定还是输出母亲节。如果大于mo,那么就输出父亲节。如果是6月份,d<fa,输出父亲节,否则,我们就要考虑输出下一年的母亲节,然后我们要重新计算下一年的母亲节的日期是多少,如果是7-12月份,我们还是要先计算下一年的母亲节是多少,然后输出即可,但是,对于如果要输出的节日在下一年的情况,我们要特判,特判,特判2099年和2100年的情况,如果是2099年的下半年,也就是输出2100年的母亲节的日期。我们令mo=9(我们要先计算一下),如果是2100年的下半年的话,我们就令mo=8,也是自己计算一下,然后,其他的年份的话就按那个计算mo的式子来就行了
代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
    //ifstream cin("aaa.txt");
    int t;
    cin>>t;
    while(t--){
        int y,m,d;
        cin>>y>>m>>d;
        int mo=14-((y-2000)+(y-2000)/4)%7;  //计算这年的母亲节的日子
        int fa=21-((y-1998)+(y-2000)/4+1)%7;
        if(y==2100){
            mo=9,fa=20;
        }
        if(m>=1&&m<=4){
            printf("Mother's Day: May %dth, %d\n",mo,y);
            continue;
        }
        if(m==5){
            if(d<mo)  printf("Mother's Day: May %dth, %d\n",mo,y);
            else{
                if(fa!=21)  printf("Father's Day: June %dth, %d\n",fa,y);
                else   printf("Father's Day: June %dst, %d\n",fa,y);
            }
            continue;
        }
        if(m==6){
            if(d<fa){
                if(fa==21)  printf("Father's Day: June %dst, %d\n",fa,y);
                else  printf("Father's Day: June %dth, %d\n",fa,y);
            }
            else{
                if(y==2100)  mo=8;
                else if(y==2099)  mo=9;
                else  mo=14-((y+1-2000)+(y+1-2000)/4)%7;
                printf("Mother's Day: May %dth, %d\n",mo,y+1);
            }
            continue;
        }
        if(m<=12&&m>=7){
            if(y==2100)  mo=8;
            else if(y==2099)  mo=9;
            else  mo=14-((y+1-2000)+(y-2000+1)/4)%7;
            printf("Mother's Day: May %dth, %d\n",mo,y+1);
            continue;
        }
    }
    return 0;
}

这种解法我是参照题解中的另一位同志的思路写的,感觉这种解法思路比较清晰,所以就对他的代码进行了一个解读,希望有帮助吧!