蒟蒻只会写这么多,都是简单题,需要多一点思考以及灵感,个人觉得写题时多写多画很有用,会突然带给自己灵感。
A题:https://ac.nowcoder.com/acm/contest/5278/A
签到题。
题意:给四个数,两两分组,问差值最小。
思路:将这四个数进行排序,第一个第四个加一块,第二个第三个加一块,计算差值就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const LL mod=1e9+7;
int main() {
//    cout<<"Accepted!\n";
    int a[4];
    cin>>a[0]>>a[1]>>a[2]>>a[3];
    sort(a,a+4);
    cout<<abs(a[0]+a[3]-a[1]-a[2]);
    return 0;
}

B题:https://ac.nowcoder.com/acm/contest/5278/B
签到题。
题意:给定n条记录,让你按照顺序列出信息中体温大于38.0的信息。顺序如下:
1.报送日期不一致的,则日期较近的在上,日期较久远的在下;
2.报送日期一致体温不一致的,则体温高的在上,体温低的在下;
3.报送日期和体温都一致的,则学号小的在上,学号大的在下。
思路:开结构体记录所有的信息,并在读取的时候记录体温大于38.0的信息条数。排序以后把符合要求的输出就好了,输出注意格式%.1f。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
struct s{
    int date;
    int num;
    double c;
}a[105];
bool cmp(s x,s y) {
    if(x.date!=y.date) return x.date>y.date;
    else if(x.c!=y.c) return x.c>y.c;
    else return x.num<y.num;
}
int main() {
//    cout<<"Accepted!\n";
    int n;
    cin>>n;
    int ans=0;
    for(int i=0;i<n;++i) {
        cin>>a[i].date>>a[i].num>>a[i].c;
        if(a[i].c>=38.0) ans++;
    }
    sort(a,a+n,cmp);
    cout<<ans<<"\n";
    for(int i=0;i<n;++i) {
        if(a[i].c>=38.0) {
            cout<<a[i].date<<" "<<a[i].num<<" ";
            printf("%.1f\n",a[i].c);
        }
    }
    return 0;
}

C题:https://ac.nowcoder.com/acm/contest/5278/C
思维题。
题意:给定两个字符串,问两个字符串最长的非公共子序列的长度,也就是选定的子序列是其中一个字符串的子序列,而不是另一个的。如果没有,就输出-1。
思路:我们可以知道如果两个字符串中任意一个字符串的子序列也是另一个字符串的子序列,那么这两个字符串一定相等,所以只要两个字符串相等就是-1。不相等的话,只要选取较长的那一个字符串当作选取的子序列就可以满足条件。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const LL mod=1e9+7;
int main() {
//    cout<<"Accepted!\n";
    string s1,s2;
    cin>>s1>>s2;
    if(s1==s2) cout<<"-1";
    else {
        cout<<max(s1.size(),s2.size());
    }
    return 0;
}

D题:https://ac.nowcoder.com/acm/contest/5278/D
思维题。
题意:给定一个n,让你用01构成长度位1-n的若干个长度不同的字符串,这若干个字符串不能有一个字符串是另一个字符串的子串的情况,问可以做几个字符串,分别是什么。
思路:我们可以先做简单的,当n=1时,必定是一个字符串,0或者1。当n=2时,我们可以找出两种分别是0,11和1,00。当n>=3时,我们根据条件可以构建出这样的序列,00,010,0110,01110,...也可以是11,101,1001,10001,...那么就可以得出答案了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const LL mod=1e9+7;
int main() {
//    cout<<"Accepted!\n";
    int n;
    cin>>n;
    if(n==1) cout<<"1\n1\n";
    else if(n==2) {
        cout<<2<<"\n";
        cout<<"1\n00\n";
    }
    else {
        cout<<n-1<<"\n";
        for(int i=2;i<=n;++i) {
            for(int j=1;j<=i;++j) {
                if(j==1) cout<<0;
                else if(j==i) cout<<0;
                else cout<<1;
            }
            cout<<"\n";
        }
    }
    return 0;
}

E题:https://ac.nowcoder.com/acm/contest/5278/E
思维题。
题意:给定一串序列,可以从首端或者尾端花一秒吃掉当前位置食物,并获得其美味度,而没过一秒没有被吃的食物就会减少1美味度。问怎么吃得到最大美味度,是多少。
思路:想一下就会发现,无论怎么吃,剩余的食物美味度都会减少1。比如还有i个食物(i>=1),任意吃一个,那么这一秒食物会降低的总美味度就是i-1。因此美味度和吃的顺序无关,所以只要计算出总共降低的美味度就好了。注意int太小。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const LL mod=1e9+7;
int main() {
//    cout<<"Accepted!\n";
    LL n;
    cin>>n;
    LL ans=0,x=0;
    for(LL i=1;i<=n;++i) {
        cin>>x;
        ans+=x;
    }
    ans=ans-((n-1)*n/2);
    cout<<ans;
    return 0;
}

F题:https://ac.nowcoder.com/acm/contest/5278/F
题意:t组测试,每组给一个日期,问最近的一次节日,以及日期。
思路:首先,父亲节是6月的第三个周日,母亲节是5月的第二个周日,那么我们想要知道父亲节和母亲节是什么时候,就要知道5月1日和6月1日是星期几,这样才能算出节日的准确日期。根据日期来计算星期几有一个算法,代码中会有,如果想仔细了解,可以查一下。当算出具体日期是,我们要判断一下距当前的日期最近的是那个节日。按照日期我们可以分为三部分,先计算当前年份母亲节的日期,如果还没到,就输出当前年份的母亲节日期就好了。如果今天就是或者已经过了,就就算当前年份的父亲节日期,如果还没到就输出当前年份的父亲节日期。如果今天就是父亲节或者已经过了,那么下一个必定是下一年的母亲节,计算出具体日期输出就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const LL mod=1e9+7;
string s[32];
void init() {
    for(int i=1;i<=31;++i) {
        s[i]="th";
    }
    s[1]="st";
    s[2]="nd";
    s[3]="rd";
    s[21]="st";
    s[22]="nd";
    s[23]="rd";
    s[31]="st";
} 
int CaculateWeekDay1(int y,int m,int d) {//计算当前日期是星期几
    if (m==1||m==2) {
        m+=12;
        --y;
    }
    return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)% 7;
}
void solve() {
    int y,m,d;
    cin>>y>>m>>d;
    int date,flag,day;
    date=CaculateWeekDay1(y,5,1);
    flag=0;
    day=1;
    while(1){
        if(date==0) flag++;
        if(flag==2) break;
        date++;
        date%=7;
        day++;
    }
    if(m*100+d<500+day) {
        cout<<"Mother's Day: May ";
        cout<<day<<s[day]<<", "<<y<<"\n";
        return;
    }
    date=CaculateWeekDay1(y,6,1);
    flag=0;
    day=1;
    while(1) {
        if(date==0) flag++;
        if(flag==3) break;
        date++;
        date%=7;
        day++;
    }
    if(m*100+d<600+day) {
        cout<<"Father's Day: June ";
        cout<<day<<s[day]<<", "<<y<<"\n";
        return;
    }
    date=CaculateWeekDay1(y+1,5,1);
    flag=0;
    day=1;
    while(1){
        if(date==0) flag++;
        if(flag==2) break;
        date++;
        date%=7;
        day++;
    }
    cout<<"Mother's Day: May ";
    cout<<day<<s[day]<<", "<<y+1<<"\n";
}
int main() {
//    cout<<"Accepted!\n";
    init();
    int t;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}