D18 C++PAT乙级

算法组-庄思彤 2024-02-07 21:26:51

img

住房空置率

img


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

int main()
{
    int n,d;
    double e;
    cin>>n>>e>>d;
    int sum1=0,sum2=0;  //可能空置,空置 
    for(int i=0;i<n;i++)
    {
        int k,num=0;  //低于阈值的天数 
        cin>>k;
        for(int j=0;j<k;j++)
        {
            double data;
            cin>>data;
            if(data<e)num++;
        }
        if(num*2>k&&k>d)sum2++;  //空置 (同时也是可能空置) 
        else if(num*2>k)sum1++;  //可能空置 
    }
    printf("%.1f%% %.1f%%",sum1*1.0/n*1.0*100,sum2*1.0/n*1.0*100);//记得添加转义字符 
    return 0;
}

求平均值

img


#include <iostream>
#include<iomanip>
#include<string>
#include<cstdlib>
using namespace std;
int main()
{
    string s,ans="";
    int i,j,n,k=0,len,flag1=0,flag2=0,flag3=0;
    double sum=0.0;
    cin>>n;
    for(i=0; i<n; i++)
    {
        cin>>s;
        len=s.length();
        for(j=0; j<len; j++)
        {
            if(s[j]=='-')  //累计负号 
            {
                ans+="-";
                flag1++;
            }
            else if(s[j]=='.')  //累计小数点 
            {
                ans+=".";
                flag2++;
            }
            else if(flag2==0&&s[j]>='0'&&s[j]<='9')  //输入为整数 
            {
                ans+=s[j];
            }
            else if(flag2>0&&s[j]>='0'&&s[j]<='9')  //输入为小数 
            {
                flag3++;
            }
            else  //输入为字母 
            {
                flag1=2;
                break;
            }

        }

        float t;
        try
        {
            size_t length;
            t =stof(s,&length);
        }
        catch(...)
        {
        }

        if(flag1>1||flag2>1||flag3>2||t<-1000||t>1000)  //为负数或多个小数点或不在范围内的数 
        {
            cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
            flag1=0;
            flag2=0;
            flag3=0;
            continue;
        }
        flag1=0;
        flag2=0;
        flag3=0;
        k++;
        sum+=t;
    }
    if(k==0)
        cout<<"The average of 0 numbers is Undefined";
    else if(k==1)
        cout<<"The average of "<<k<<" number is "<<fixed<<setprecision(2)<<sum/k;
    else
        cout<<"The average of "<<k<<" numbers is "<<fixed<<setprecision(2)<<sum/k;
    return 0;
}

集体照

img


#include <iostream>
#include <algorithm>
#include <vector> 
using namespace std;

struct node{  //结构体储存姓名和身高数据 
    string name;
    int tall;
};
bool cmp(node a,node b){
    if(a.tall==b.tall)
        return a.name<b.name;
    else 
        return a.tall>b.tall;
}

int main()
{
    int n,k;
    cin>>n>>k;
    vector<node>vstu;
    node tmp;
    for(int i=0;i<n;i++)
    {
        cin>>tmp.name>>tmp.tall;
        vstu.push_back(tmp);
    }
    sort(vstu.begin(),vstu.end(),cmp);  //降序排序 
    int ftmp=n/k+n%k;  //第一排人数 
    string vlist[k][ftmp];
    int index=0;  //顺序取出数据 
    for(int i=0;i<k;i++)
    {
        int num=n/k;  //每排人数 
        if(i==0)  //多的都加到第一排 
        {
            num+=n%k;
        }
        int mid=(num/2+1)-1;  //中间位置 
        vlist[i][mid]=vstu[index++].name;
        for(int j=1;mid+j<num||mid-j>=0;j++)
        {
            if(mid-j>=0)
              vlist[i][mid-j]=vstu[index++].name;  //左 
            if(mid+j<num)
              vlist[i][mid+j]=vstu[index++].name;  //右 
        }
    }
    for(int i=0;i<k;i++)  //输出 
    {
        for(int j=0;j<ftmp;j++)
        {
            if(vlist[i][j]!="")  //非空才输出 
            {
                if(j!=0) cout<<" ";
                cout<<vlist[i][j];
            }
        }
        cout<<endl;
    }
    return 0;
}

组合数的和

img

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

int main()
{
    int n;
    cin>>n;
    int sum=0;
    int a=0;
    for(int i=0;i<n;i++)
    {
        cin>>a;
        sum+=a;
    }//每个数字作为十位的时候都会出现n-1次,作为个位的时候也会出现n-1次 
    int b=sum*10*(n-1)+sum*(n-1);  
    cout<<b;
    return 0;
}


数零壹

img


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

int main()
{
    string s;
    getline(cin,s);
    int sum=0;
    for(int i=0;i<s.length();i++)
    {
        s[i]=tolower(s[i]);  //全部转换为小写 
        if(s[i]>='a'&&s[i]<='z')  //括号等字符不读入 
        {
            int num=s[i]-'a'+1;  //全部转换为数字 
            sum+=num;  //求和 
        }
    }
    int n0=0;
    int n1=0;
    while(sum!=0)  //转换为二进制数 
    {
        if(sum%2==0) n0++;  //统计0的数量 
        else n1++;  //统计1的数量 
        sum=sum/2;
    }
    cout<<n0<<' '<<n1;
    return 0;
}

C语言竞赛

img


#include <iostream>
#include <set>
#include <cmath>
using namespace std;
int ran[10000];
bool isprime(int a) {//判断是否是素数
    if(a<=1) return false;
    int Sqrt=sqrt((double)a);
    for(int i=2;i<=Sqrt;i++) {
        if(a%i==0)
            return false;
    }
    return true;
}
int main() {
    int n,k;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        int id;
        scanf("%d",&id);
        ran[id]=i+1; //标记每个id对应的排名
    }
    scanf("%d",&k);
    set<int> ss;  //ss存储所有已经询问过的id
    for(int i=0;i<k;i++)
    {
        int id;
        scanf("%d",&id);
        printf("%04d: ",id);
        if(ran[id]==0)
        {
            printf("Are you kidding?\n");
            continue;
        }
 
        if(ss.find(id)==ss.end())
        {
            ss.insert(id);
        } 
        else 
        {
            printf("Checked\n");
            continue;
        }
        if(ran[id] == 1) 
        {
            printf("Mystery Award\n");
        }
        else if(isprime(ran[id])) 
        {
            printf("Minion\n");
        }
        else 
        {
            printf("Chocolate\n");
        }
    }
    return 0;
}

爱丁顿数

img


#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a,int b){
    return a>b;
}
int main()
{
    int n,a[100000],i;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n,cmp);  //排序 
    for(i=0;i<n;i++)
    {
        if(a[i]<=i+1)  
          break;
    }
    cout<<i;
    return 0;
}

判断题

img


#include <bits/stdc++.h>
using namespace std;
int sum[101],sc[101],a[101];
int main()
{
    int n,m;   //学生人数,题目数量 
    cin>>n>>m;
    for(int i=0;i<m;i++) cin>>sc[i];  //题目分数 
    for(int i=0;i<m;i++) cin>>a[i];  //正确答案 
    for(int i=0;i<n;i++)  //遍历每个人 
    {
        for(int j=0;j<m;j++)  //遍历个人做的每道题 
        {
            int x;
            cin>>x;  //学生答案 
            if(x==a[j]) sum[i]+=sc[j];  //如果学生答案为正确答案,则将本题分数加到该学生总分里 
        }
    }
    for(int i=0;i<n;i++)cout<<sum[i]<<endl;
    return 0;
}

最简分数

img


#include <iostream>
#include <cstdio>
#include <string.h>
#include <math.h> 
using namespace std;
int asd(int a,int b){
    for(int i=2;i<=a;i++)
    {
        if(a%i==0&&b%i==0)return true;  //找公约数 
    }
    return false;
} 
int main()
{
    int a1,a2,b1,b2,k;
    scanf("%d/%d %d/%d %d",&a1,&a2,&b1,&b2,&k);
    double n=(double)a1/a2;
    double m=(double)b1/b2;
    if(n>m)
    {
        double temp=n;
        n=m;
        m=temp;
    }
    int flag=true;
    for(int i=1;i<k;i++)
    {
        if(!asd(i,k))
        {
            double x=(double)i/k;
            if(x>n&&x<m)
            {
                if(flag)
                {
                    printf("%d/%d",i,k);
                    flag=false;
                }
                else
                {
                    printf(" %d/%d",i,k);
                }
            }
        }
    }
}

...全文
44 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

265

社区成员

发帖
与我相关
我的任务
社区描述
一个供Leaders学习交流的地方
c++javapython 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • 叫我胡萝北
  • CheungZzzc
  • szu_gexu
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧