这套题还是比较基础的。

  首先b题是队友a的,我只是刚读懂题,如果没读错的话,应该就是匹配字符串,如果有一个happiness就输出yes,且输出匹配的位置和下一个位置就行,如果没有happiness就随便输出两个位置就行,如果有两个以上的,就输出no

  附上队友的代码

#include <iostream>
#include <map>
#include <set>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int maxn=2e5+10;
char s[maxn];
char t[maxn]={0,'h','a','p','p','i','n','e','s','s'};
int len;

bool judge(int addr){
    for(int i=1;i<=9;i++)
        {
            if(s[i+addr-1]!=t[i]) return 0;
        }
    
    return 1;
}
int find(){
    for(int i=1;i<=len;i++)
        {
            if(judge(i))
                {
                    return i;
                }
        }
        
    return 0;
}
int main(){
    scanf("%s",s+1);
    len=strlen(s+1);
    int t1=find();
    if(!t1)
        {
            swap(s[1],s[2]);
            int tmp=find();
            if(!tmp) printf("YES\n1 2\n");
            else printf("YES\n1 3\n");
        
    }
    else if(t1)
        {
            s[t1]=1;
            int t2=find();
            if(!t2) printf("YES\n%d %d\n",t1,t1+1);
            else
                {
                    s[t2]=1;
                    int t3=find();
                    if(!t3) printf("YES\n%d %d\n",t1,t2+1);
                    else printf("NO\n");
                }
        }

    return 0;
}

c题水题,签到,但是还是wa了2次,没考虑情况全

就只需要假设不知道颜色的球的颜色为红或者绿就行了

#include <iostream>
using namespace std;
int main(){
    int a,b,c;
    int n,m;
     cin>>a>>b>>c>>n>>m;
     if(a+c>n&&b+c>m) cout<<min(n,m)<<endl;
     else if(a+c>n&&b+c<=m) cout<<n<<endl;
     else if(a+c<=n&&b+c>m) cout<<m<<endl;
     else if(a+c<=n&&b+c<=m) cout<<a+b+c<<endl;
    return 0;
}

D题想了挺久的,但其实方法还是挺简单的,就是求这个序列的所有元素的最大公约数,只要是这个公约数的倍数,就可以通过这个序列的元素进行表示(莫名wa了一次然后改了long long)

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int gcd(int a,int b)
{
    return (b>0)?gcd(b,a%b):a;
}

int main(){
    int n,m;
    long long num[200005];
    cin>>n>>m;
    for(int i=0;i<n;i++) cin>>num[i];
    long long t=num[0];
    for(int i=1;i<n;i++){
        t=gcd(t,num[i]);
    }
    if(m%t==0||m==0) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}

f题思路和题意都挺简单的,就是一开始如果对每次操作都对字符串添加前缀的话,会MLE,所以只能记录下每次的操作,然后找到与第一个人相关的所有元素形成链,如果循环输出前缀,最后输出链末尾的人的名字

#include <iostream>
#include <map>
#include <algorithm>
#include <cstring>
using namespace std;
int gcd(int a,int b)
{
    return (b>0)?gcd(b,a%b):a;
}
    string s[200005];
    int num[200005];
    int flag[200005];
int main(){
    int n,m;
    memset(num,0,sizeof(num));
    cin>>n;
    for(int i=1;i<=n;i++) cin>>s[i];
    cin>>m;
    int q,w;
    for(int i=0;i<m;i++){
        cin>>q>>w;
        num[q]=num[w]+1;
        s[q]=s[w];
    }
    if(num[1]==0) cout<<s[1]<<endl;
    else {
        string ss;
        for(int i=0;i<num[1];i++) cout<<"I_love_";
        cout<<s[1]<<endl;
    }
    return 0;
}

L题吃鸡,就是贪心就行了,将杀人数的和与人数进行比较,判断yes or no ,然后从后向前找,如果杀人数大于0的,就每次输出这个以及最后一个人,慢慢向前增加

唯一要注意的是杀人数的和需要用long long 存,以及全场没人杀人的情况。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <cstring>
using namespace std;
    int num[200005];
    int q[200005],w[200005];
int main()
{
    int n;
    long long m=0;
    int t=1000000;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&num[i]);
        if(num[i]==0) t=min(t,i-1);
        m+=num[i];
    }
    if(m>=n) printf("NO\n");
    else{
        printf("YES\n");
        if(t==0){
            return 0;
        }
        for(int i=n;i>1;i--){
            if(num[t]>0){
                num[t]--;
                cout<<t<<' '<<i<<endl;
            }
            else if(t>1){
                t--;
                num[t]--;
                cout<<t<<' '<<i<<endl;
            }
        }
    }
}