周末练习2(2018 JUST Programming Contest 1.0)

G

题目大概:

给出长度为n的字符串,q此操作,然后id,字符q,把id位置的字符替换为q,看是否是回文串。最后问q此操作有几次操作之后是回文串。

思路:

根据数据,暴力显然是不行的,长度和操作数都是1e5.

可以先把给出的字符串按照对称位置,计算有多少个对称位置不同记为sum。然后,每次修改的时候,比较和对称位置的变化情况,然后维护sum值,当sum为0的时候就是回文串。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;
const int maxn=110000;
const int mod=1e9+7;
using namespace std;
char a[maxn];
int pan(char b[])
{
    int l=strlen(b);
    char c[maxn];
    for(int i=0;i<l;i++)
    {
        c[i]=b[l-i-1];
    }
    int ans=0;
    for(int i=0;i<l/2;i++)
    {
        if(b[i]!=c[i])
        {
            ans++;
        }
    }
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d%d%s",&n,&m,a);
        int ans=0;
        int l=strlen(a);
        int sum=pan(a);
        for(int i=1;i<=m;i++)
        {
            int id;
            char q;
            scanf("%d %c",&id,&q);
            id--;
            if(a[l-1-id]==a[id])
            {
                a[id]=q;
                if(a[l-1-id]==a[id])
                {
                }
                else sum++;
                if(sum==0)ans++;
            }
            else
            {
                a[id]=q;
                if(a[l-1-id]==a[id])
                {
                    sum--;
                }
                if(sum==0)ans++;
            }
            //printf("%d\n",sum);
        }
        printf("%d\n",ans);
    }
    return 0;
}

H

题目大概:

有两只队伍踢足球,分别再自己场地和另一方场地踢球。哪一方进球多,哪一方就赢了,去过数量相同。哪一方在对手场地进球多,便哪一方赢了,如果都相同,则返回-1.

思路:

按照题目大概模拟一遍。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;
const int maxn=110000;
const int mod=1e9+7;

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int a,b,c,d;
        scanf("%d%d%d%d",&a,&b,&c,&d);
        int sum1=a+c;
        int sum2=b+d;
        if(sum1>sum2)
        {
            printf("1\n");
        }
        else if(sum1<sum2)
        {
            printf("2\n");
        }
        else if(sum1==sum2)
        {
            if(c>b)
            {
                printf("1\n");
            }
            else if(c<b)
            {
                printf("2\n");
            }
            else
            {
                printf("-1\n");
            }
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/a1046765624/article/details/80302218