关于读取字符。。。

P2704 [NOI2001] 炮兵阵地

遮云壑 @ 2021-09-05 11:43:07

有没有哪位大佬给我讲讲这cin和getchar有什么区别,好几次了,本地AC提交WA,把getchar改成cin就行了??

#include<bits/stdc++.h>
#define N 105
using namespace std;
inline void read(int& x)
{
    x=0;int y=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')y=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    x=x*y;
}

int n,m,a[N],dp[(1<<10)][(1<<10)][3],sum[(1<<10)];

inline int getsum(int x)
{
    int ans=0;
    while(x)
    {
        if(x&1)ans++;
        x>>=1;
    }
    return ans;
}

int main(){
    read(n),read(m);
    int pow=(1<<m);char ch;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>ch;//没错没错就是这里
            a[i]<<=1;
            if(ch=='H')a[i]++;
        }
    }
    for(int i=0;i<pow;i++)sum[i]=getsum(i);
    for(int s=0;s<pow;s++)
    {
        if((s&a[0])||(s&(s<<1))||(s&(s<<2)))continue;
        dp[0][s][0]=sum[s];
    }
    for(int L=0;L<pow;L++)
    {
        for(int S=0;S<pow;S++)
        {
            if(L&S||L&a[0]||S&a[1]||(L&(L<<1))||(L&(L<<2))||(S&(S<<1))||(S&(S<<2)))continue;
            dp[L][S][1]=sum[L]+sum[S];
        }
    }
    for(int i=2;i<n;i++)
    {
        for(int L=0;L<pow;L++)
        {
            if((L&(L<<1))||(L&(L<<2)||L&a[i-1]))continue;
            for(int S=0;S<pow;S++)
            {
                if(S&a[i]||S&(S<<1)||S&(S<<2)||L&S)continue;
                for(int LL=0;LL<pow;LL++)
                {
                    if(LL&a[i-2]||LL&L||LL&S||LL&(LL<<1)||LL&(LL<<2))continue;
                    dp[L][S][i%3]=max(dp[L][S][i%3],dp[LL][L][(i-1)%3]+sum[S]);
                }
            }
        }
    }
    int ans=0;
    for(int L=0;L<pow;L++)
    {
        for(int S=0;S<pow;S++)
        {
            ans=max(ans,dp[L][S][(n-1)%3]);
        }
    }
    printf("%d\n",ans);
    return 0;
}

然后下面的是90分的,样例WA了hhhhh

#include<bits/stdc++.h>
#define N 105
using namespace std;
inline void read(int& x)
{
    x=0;int y=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')y=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    x=x*y;
}

int n,m,a[N],dp[(1<<10)][(1<<10)][3],sum[(1<<10)];

inline int getsum(int x)
{
    int ans=0;
    while(x)
    {
        if(x&1)ans++;
        x>>=1;
    }
    return ans;
}

int main(){
    read(n),read(m);
    int pow=(1<<m);char ch;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            ch=getchar();//没错没错就是这里
            a[i]<<=1;
            if(ch=='H')a[i]++;
        }
        ch=getchar();//把回车读掉
    }
    for(int i=0;i<pow;i++)sum[i]=getsum(i);
    for(int s=0;s<pow;s++)
    {
        if((s&a[0])||(s&(s<<1))||(s&(s<<2)))continue;
        dp[0][s][0]=sum[s];
    }
    for(int L=0;L<pow;L++)
    {
        for(int S=0;S<pow;S++)
        {
            if(L&S||L&a[0]||S&a[1]||(L&(L<<1))||(L&(L<<2))||(S&(S<<1))||(S&(S<<2)))continue;
            dp[L][S][1]=sum[L]+sum[S];
        }
    }
    for(int i=2;i<n;i++)
    {
        for(int L=0;L<pow;L++)
        {
            if((L&(L<<1))||(L&(L<<2)||L&a[i-1]))continue;
            for(int S=0;S<pow;S++)
            {
                if(S&a[i]||S&(S<<1)||S&(S<<2)||L&S)continue;
                for(int LL=0;LL<pow;LL++)
                {
                    if(LL&a[i-2]||LL&L||LL&S||LL&(LL<<1)||LL&(LL<<2))continue;
                    dp[L][S][i%3]=max(dp[L][S][i%3],dp[LL][L][(i-1)%3]+sum[S]);
                }
            }
        }
    }
    int ans=0;
    for(int L=0;L<pow;L++)
    {
        for(int S=0;S<pow;S++)
        {
            ans=max(ans,dp[L][S][(n-1)%3]);
        }
    }
    printf("%d\n",ans);
    return 0;
}

by heziyue0921 @ 2021-09-05 11:47:22

看看对你是否有帮助qwq


by BootsH @ 2021-09-05 11:49:22

getchar能读换行回车空格,std::cin不行


|