T1

长度奇数必定不行

偶数提取出来判断即可

#include<bits/stdc++.h>
using namespace std;
int T;
string s,s1,s2;
void work()
{
    s1="",s2="";
    cin>>s;
    int S=s.size();
    if(S%2==1)
    {
        puts("NO");
        return;
    }
    for(int i=0;i<S/2;i++)
    {
        s1+=s[i];
    }
    for(int i=S/2;i<S;i++)
    {
        s2+=s[i];
    }
    if(s1==s2)
    {
        puts("YES");
    }
    else
    {
        puts("NO");
    }
}
int main()
{
    cin>>T;
    while(T--)
    {
        work();
    }
    return 0;
}

T2

因为个数很少

暴力枚举数字然后添加即可

最后去重再累加答案

#include<bits/stdc++.h>
#define LL long long
using namespace std;
int T;
LL n,a[114514];
void work()
{
    LL top=0,ans=0;
    scanf("%lld",&n);
    LL m=sqrt(n)+10;
    for(LL i=1;i<=m;i++)
    {
        LL x=i*i;
        LL y=i*i*i;
        if(x<=n) a[++top]=x;
        if(y<=n && x!=y) a[++top]=y;
    }
    sort(a+1,a+1+top);
    ans=min(1LL,top);
    for(LL i=2;i<=top;i++)
    {
        if(a[i]!=a[i-1]) ans++;
    }
    printf("%lld\n",ans);
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        work();
    }
    return 0;
}

T3

由于 $T$ 只能是 abc 的一种排列

我们只要特判 $T=$ abc 即可,需要改成 a...acb...bc...c... 的形式

#include<bits/stdc++.h>
using namespace std;
int T,b[30];
string s,t;
void work()
{
    memset(b,0,sizeof b);
    cin>>s>>t;
    for(int i=0;i<s.size();i++)
    {
        b[s[i]-'a']++;
    }
    if(b[0]==0 || b[1]==0 || b[2]==0)
    {
        for(int i=0;i<26;i++)
        {
            for(int j=1;j<=b[i];j++)
            {
                putchar(i+'a');
            }
        }
    }
    else if(t=="abc")
    {
        for(int i=1;i<=b[0];i++) putchar('a');
        for(int i=1;i<=b[2];i++) putchar('c');
        for(int i=1;i<=b[1];i++) putchar('b');
        for(int i=3;i<26;i++)
        {
            for(int j=1;j<=b[i];j++)
            {
                putchar(i+'a');
            }
        }
    }
    else
    {
        for(int i=0;i<26;i++)
        {
            for(int j=1;j<=b[i];j++)
            {
                putchar(i+'a');
            }
        }
    }
    puts("");
    return;
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        work();
    }
    return 0;
}

T4

$a\%b=x$ 仅当 $a > 2 \times x$ 才可

如果数组中有排列的数字就直接用,没有的数字排序后按上面公式判断是否可行

#include<bits/stdc++.h>
using namespace std;
int T,n,a[100010],b[100010],top;
bool v[100010];
bool cmp(int x,int y)
{
    return x<y;
}
void work()
{
    top=0;
    for(int i=0;i<=n;i++) v[i]=0;
    
    
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]>0 && a[i]<=n && !v[a[i]])
        {
            v[a[i]]=1;
        }
        else
        {
            b[++top]=a[i];
        }
    } 
    sort(b+1,b+1+top);
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(v[i]) continue;
        if(b[++cnt]<=i*2)
        {
            puts("-1");
            return;
        }
    }
    printf("%d\n",cnt);
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        work();
    }
    return 0;
}

T5

待填充

T6

待填充

最后修改:2023 年 08 月 18 日
如果觉得我的文章对你有用,请随意赞赏