T1减法和求余

错因 :没开(long long (╬▔皿▔)╯)

思路

如果是减法 可根据样例得知 是所有数-2*最小的数

如果是求模 可根据余数小于除数得知 是最小的数

正确代码

    #include<bits/stdc++.h>
    using namespace std;
    int a[100010];
    int main()
    {
        freopen("divmod.in","r",stdin);
        freopen("divmod.out","w",stdout);
        long long n,k,sum=0;
        cin>>n>>k;
        for(int i=1;i<=n;i++) cin>>a[i];
        sort(a+1,a+n+1);
        if(k==1)
        {
            if(n==1) cout<<a[n];
            else if(n==2) cout<<a[2]-a[1];
            else
            {
                sum=abs(a[1]-a[2]);
                for(int i=3;i<=n;i++) sum+=a[i];
                cout<<sum; 
            }
        }
        else cout<<a[1];
        return 0;
    }

T2回文串

错因 :无 q(≧▽≦q)

思路

先找到不是回文的地方

如果只有一处

将这里和对应的位置改成'a' 有几个不是'a'的修改次数减几

如果有两处

将每一处和对应的位置改成其中字典序小的 修改次数-2

如果没有

将不是'a' 最靠前的位置·改成‘ 'a' 修改次数-2

如果还有修改次数 将最中间的改为'a'

正确代码

    #include<bits/stdc++.h>
    using namespace std;
    int b[3],idx;
    int main()
    {
        freopen("hw.in","r",stdin);
        freopen("hw.out","w",stdout);
        int k,cnt=2,z;
        string s;
        cin>>s;
        if(s.size()%2==1) k=s.size()/2;
        else k=s.size()/2-1;
        for(int i=0;i<=k;i++)
        {
            if(s[i]!=s[s.size()-i-1])
            {
                 b[++idx]=i;
            }
        }
        if(idx==1)
        {
            z=b[1];
            if(s[z]!='a') cnt--;
            if(s[s.size()-z-1]!='a') cnt--;
            s[z]='a';
            s[s.size()-z-1]='a';
        }
        else if(idx==2)
        {
            for(int j=1;j<=idx;j++)
            {
                z=b[j];
                if(s[z]<s[s.size()-z-1]) s[s.size()-z-1]=s[z];
                else s[z]=s[s.size()-z-1];
                cnt--;
            }
        }
        else 
        {
            z=0;
            if(s[z]!='a') cnt--;
            if(s[s.size()-z-1]!='a') cnt--;
            s[z]='a';
            s[s.size()-z-1]='a';
        }
        if((cnt==1||cnt==2)&&s.size()%2==1)    s[k]='a';
        cout<<s;
        return 0;
    }

T3涂色仪式

思路

相邻的节点只要是质数,答案就++

用埃氏筛法

正确代码

    #include<bits/stdc++.h>
    using namespace std;
    int pr[150000],idx,flag[2000000],a[300010];
    void init()
    {
        for(int i=2;i<=2000000;i++)
        {
            if(!flag[i]) 
            {
                pr[++idx]=i;
                for(int j=i*2;j<=2000000;j+=i) flag[j]=1;
            }
        }
        return ;
    }
    int main()
    {
        freopen("color.in","r",stdin);
        freopen("color.out","w",stdout);
        init();
        int n,cnt=0;
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n-1;i++)
        {
            int u,t;
            cin>>u>>t;
            if(!flag[a[u]+a[t]]) cnt++;
        }
        cout<<cnt;
        return 0;
    }
    

T4除法来咯

思路

我们可以枚举商 商一定可以取到5

如果他比1e6*商还大肯定不可以

a[i]/j是除数

a[i]%j是余数

除数必须大于余数

所以如果(a[i]/j)<=(a[i]%j) 肯定也不可以

正确代码

    #include<bits/stdc++.h>
    using namespace std;
    int a[100010],f[6];
    int main()
    {
        freopen("div.in","r",stdin);
        freopen("div.out","w",stdout);    
        int n,maxx=0,cnt=0;
        cin>>n;
        for(int i=1;i<=n;i++) 
        {
            cin>>a[i];    
            for(int j=1;j<=5;j++) 
            {
                int t=a[i]/1000000;
                if((a[i]/j)>(a[i]%j)&&t<=j) f[j]++;
            }
        }
        for(int i=1;i<=5;i++) maxx=max(maxx,f[i]);
        cout<<maxx;
        return 0; 
    }