美文网首页
2019-08-08(甲级3题)

2019-08-08(甲级3题)

作者: MuserQuantity | 来源:发表于2019-08-08 21:48 被阅读0次

1009 Product of Polynomials (25 分)

这道题是1002的升级版,求多项式A*B,其实都异曲同工,将多项式A保存在数组a中,然后B中每输入一项,就跟多项式A相乘,结果累加到数组b中,逆序输出即可。

1108 Finding Average (20 分)

输入一些字符串,逐个判断是否符合条件,并将符合条件的字符串([-1000,1000]的最多含2位小数的数字)累加求平均值。
这道题的坑在: 当只有一个值的时候,numbers要改为number,而输出照样是保留2位小数
代码如下:

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

int main(){
    int n,cnt=0;
    float total=0;
    string now;
    cin>>n;
    for(int i=0;i<n;i++){
        string s;
        cin>>s;
        int len=s.length();
        //flag=1为符合,flag=0为不符合;sign记录负号;遇到小数点后digit++
        int flag=1,sign=0,digit=-1;
        float sum=0;
        for(int j=0;j<len;j++){
            if(!(s[j]=='-'||s[j]=='.'||(s[j]>='0'&&s[j]<='9'))){
                flag=0;
                break;
            }
            if(j==0&&s[j]=='-')sign=1;
            else if(s[j]=='.')digit++;
            else if(digit>=0&&digit<2){
                if(digit==0)sum+=(s[j]-'0')*0.1;
                else if(digit==1)sum+=(s[j]-'0')*0.01;
                digit++;
            }
            else if(digit>=2){
                flag=0;
                break;
            }
            else{
                sum=sum*10+(s[j]-'0');
            }
        }
        if(flag){
            if(sum>1000||sum<-1000){//sum
                cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
                continue;
            }
            now=s;
            if(sign==1)total-=sum;
            else total+=sum;
            cnt++;
        }
        else{
            cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
        }
    }
    if(cnt==1){//注意此处的number没有s
        printf("The average of %d number is %.2f",cnt,total/cnt);
    }
    else if(cnt>=1){
        printf("The average of %d numbers is %.2f",cnt,total/cnt);
    }
    else{
        cout<<"The average of 0 numbers is Undefined";
    }
    return 0;
}

1148 Werewolf - Simple Version (20 分)

万恶的狼人杀!
其实这道题不难,真的不难,去年考乙级做的时候,一心只想着用i和j去假设说假话的人,但其实这样是没办法做的,因为有些人没办法确定是狼人还是好人(没被提及),而且有些人可能被重复提及。换一种思路,若反过来,我们用i和j去假设是狼人,那么剩下的就是好人了,把所有人说的话都遍历一遍,如果结果刚好符合条件,就直接输出并return,否则就是没找到符合的结果,输出没有解。
代码如下:(简单得一匹)

#include <iostream>
#include <string>
using namespace std;

int main(){
    int n,tell[105],a[105]={0},lie[105]={0};
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>tell[i];
    }
    //假设i和j是狼人
    for(int i=1;i<n;i++){
        for(int j=i+1;j<=n;j++){
            //初始状态谁都没说谎,都是0
            for(int k=1;k<=n;k++)lie[k]=0;
            for(int k=1;k<=n;k++){
                //第k个人说,那个编号的人是狼人,但那个人的编号不等于i也不等于j
                if(tell[k]<0&&(abs(tell[k])!=i&&abs(tell[k])!=j))lie[k]=1;
                //第k个人说,那个编号的人是好人,但那个人的编号等于i或者等于j
                if(tell[k]>0&&(tell[k]==i||tell[k]==j))lie[k]=1;
            }
            //cnt统计说谎人数,wolf统计说谎狼人数
            int cnt=0,wolf=0;
            for(int k=1;k<=n;k++){
                //如果第k个人说谎了,那cnt++
                if(lie[k]==1)cnt++;
                //如果第k个人说谎了并且是狼人,那wolf++
                if(lie[k]==1&&(k==i||k==j))wolf++;
            }
            //如果说谎人数统计为2个,说谎的狼人统计为1个,那么就可以直接输出结果了。
            if(cnt==2&&wolf==1){
                cout<<i<<" "<<j;
                return 0;
            }
        }
    }
    //没在假设里得到结果,那么就是没结果
    cout<<"No Solution";
    return 0;
}

相关文章

网友评论

      本文标题:2019-08-08(甲级3题)

      本文链接:https://www.haomeiwen.com/subject/tkyfjctx.html