打字

题目传送门

这个题目太垃圾了,题面没说清楚

首先,这个题目非常简单,有几个地方我没有搞对

1.freopen写错了

大忌!!!!!

千万不要把w写成r,或者点写成逗号

2.只判断了第一个字母是不是大写,并没有判断其他字母是不是都是**小写**!很重要,不然freopen写对了也只是40分
下面展示错误代码

#include<bits/stdc++.h>
using namespace std;

void gmin(int &x,int y){x=min(x,y);}
void gmax(int &x,int y){x=max(x,y);}

int n;
char s[11][1005][1005];
int len[11][1005],a[11];//len_i,j表示第i句话的第j个单词的长度,a_i表示第i句话有几个单词
 
bool check_alp(char ch){
    if(ch=='.'||ch=='!'||ch=='?'||ch==' '||ch=='\n') return 0;
    return 1;
}

int main(){
    freopen("word.in","r",stdin);
    freopen("word.out","r",stdout);//w写成r了,RTE0!
    int cnt=1;
    a[cnt]=1;
    scanf("%d\n",&n);
    while(1){
        char ch;
        scanf("%c",&ch);
        if(check_alp(ch)){
            s[cnt][a[cnt]][++len[cnt][a[cnt]]]=ch;
        }else{
            if(ch==' '){//纯空格
                a[cnt]++;
            }else if(ch=='.'||ch=='?'||ch=='!'){//标点 
                cnt++;a[cnt]=1;
            }else{
                break;
            }
        }
    }
    for(int i=1;i<=n;i++){
        int ans=0;
        for(int j=1;j<=a[i];j++){
            if(len[i][j]==1){
                char ch=s[i][j][1];
                if('A'<=ch&&ch<='Z') ans++;
                continue;
            }
            char ch1,ch2;
            ch1=s[i][j][1];
            ch2=s[i][j][len[i][j]];
            if('A'<=ch1&&ch1<='Z'){
                if('a'<=ch2&&ch2<='z') ans++;//不知道这里在干什么,不需要判断最后一个字符,我可能是被题面误解了
                //这里还需要判断其他字母
            }
        }
        printf("%d\n",ans);
    }
}

接下来是正解

#include<bits/stdc++.h>
using namespace std;

void gmin(int &x,int y){x=min(x,y);}
void gmax(int &x,int y){x=max(x,y);}

int n;
char s[11][1005][1005];
int len[11][1005],a[11];//len_i,j表示第i句话的第j个单词的长度,a_i表示第i句话有几个单词
 
bool check_alp(char ch){
    if(ch=='.'||ch=='!'||ch=='?'||ch==' ') return 0;
    return 1;
}

int main(){
    freopen("word.in","r",stdin);
    freopen("word.out","w",stdout);//cao!
    int cnt=1;
    a[cnt]=1;
    scanf("%d\n",&n);
    while(1){
        char ch;
        scanf("%c",&ch);
        if(check_alp(ch)){
            s[cnt][a[cnt]][++len[cnt][a[cnt]]]=ch;
        }else{
            if(ch==' '){//纯空格
                a[cnt]++;
            }else if(ch=='.'||ch=='?'||ch=='!'){//标点 
                cnt++;a[cnt]=1;
                scanf("%c",&ch);
                //一定要特判 
                if(ch=='\n') break;
            }
        }
    }
    for(int i=1;i<=n;i++){
        int ans=0;
        for(int j=1;j<=a[i];j++){
            if(len[i][j]==1){
                char ch=s[i][j][1];
                if('A'<=ch&&ch<='Z') ans++;
                continue;
            }
            if('A'<=s[i][j][1]&&s[i][j][1]<='Z'){//判断第一个字母是不是大写的
                bool f=1;
                for(int k=2;k<=len[i][j];k++){//判断剩余字母是不是都是小写的
                    f&=('a'<=s[i][j][k]&&s[i][j][k]<='z');
                }
                if(f) ans++;
            }
        }
        printf("%d\n",ans);
    }
}

我不知道为什么这个题目的标点符号是一个半角加一个空格,为什么不能直接是一个空格呢?而且改来改去,这个题属实有一点人机

0 条评论

目前还没有评论...