设为首页 加入收藏

TOP

2022年冬pat乙级考试题目及代码解析附部分错误原因(二)
2023-07-23 13:38:37 】 浏览:88
Tags:2022年冬 pat 解析附
;bianhao); bool b;cin>>b; xyren[bianhao]=b;//这个也多用不了多少时间 //xyren.insert(make_pair(bianhao,b));本来想用insert省时间,但是用insert会导致出错,所以还是用重载的[]吧 } for(auto it=xyren.begin();it!=xyren.end();it++){ if(it->second==1){ cnt++; booy.emplace_back(it->first); } } int k=booy.size(); for(int i=0;i<k;i++){ printf("%04d",booy[i]); if(i<k-1)printf(" "); } if(cnt==1){ printf("\nDa Ben Zhong is found!"); return 0; } printf("\nThere are %d suspects.",cnt); return 0; }

B-4 真分数的约分

分数 20 作者 陈越 单位 浙江大学
喜欢用大图看题目的点这里哦,为你们准备啦

真分数是指分子小于分母的分数。对分数进行约分,是指将分子分母共同的因子消去。但还有一种另类的简单约分:直接将分子分母共有的一对数字消去。这种方法大多数情况下都得不到正确的结果,但有时候却也碰巧能对!例如 26/65 = 2/5 就是直接消去 6 的结果。
现给定一个真分数,你的任务是判断它是否能用简单约分方法得到正确结果。注意:如果有多种简单约分的可能,一定按从左到右的顺序约掉数字。

输入格式:

输入在一行中给出一个真分数的分子 a 和分母 b,其间以空格分隔。题目保证 0<a<b≤10^5。

输出格式:

在一行中先后输出这个真分数在简单约分前后的样子。如果两个分数相等,则在两者间加一个 = 号;否则加一个 != 号。格式为 a/b = c/d 或 a/b != c/d。

输入样例 1:
39 195
输出样例 1:
39/195 = 3/15
输入样例 2:
1234 23452
输出样例 2:
1234/23452 != 1/52
输入样例 3:
1234 5678
输出样例 3:
1234/5678 = 1234/5678

思路:

做多了的人都知道,到这题就会变着法子的卡测试点了,不过这次不是卡的时间,卡的有两个点详情看我代码

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int m,n;cin>>m>>n;
    string a=to_string(m),b=to_string(n);
    for(int i=0;i<a.size();i++){
        if(b.find(a[i])!=string::npos){
            b.erase(b.find(a[i]),1);
            a.erase(i,1);
            i--;
        }
    }
    if(a.size()==0)a="0";//坑人;首先是全部删除运行错误,我把它保留
    //最后一位,又答案错误。看了很久才看出来是要把它补为0
    if(stod(b)>0&&(double)m/(double)n==stod(a)/stod(b))cout<<m<<"/"<<n<<" = "<<stoi(a)<<"/"<<stoi(b)<<endl;
    else cout<<m<<"/"<<n<<" != "<<stoi(a)<<"/"<<stoi(b)<<endl;
    //输出整数尽量不要使用字符串输出,不然去前导零很麻烦
    return 0;
}

B-5 取行李

分数 25 作者 陈越 单位 浙江大学
image
喜欢用大图看题目的点这里哦,为你们准备啦

一般机场里,航班到达后,旅客们会去到达区的行李传送带那里取自己的行李。现假设有一座特别的机场,每条传送带只有一个取行李的窗口。旅客们必须排好队,逐一到窗口取自己的行李。但是当某人到窗口前,发现行李不是自己的,那人就只好走到队尾去等下一次机会。此时那件行李会一直等在窗口,直到它的主人把它取走。假设每一次认领需要 1 分钟,本题就要求你计算传送带清空需要的时间、以及旅客们的平均等待时间。

例如,假设行李 i 属于旅客 i。行李的到达顺序是 1、2、3,旅客的到达顺序是 2、1、3。则 1 号行李要等 2 分钟才能被主人 1 号旅客取走。这时行李队列中有 2、3,旅客队列中是 3、2。于是 2 号行李还要等 2 分钟才能被 2 号旅客取走,最后 3 号在第 5 分钟取走行李。旅客们的平均等待时间是 (2+4+5)/3≈3.7。

输入格式:

输入首先在第一行给出一个正整数 N(≤10^3)。下一行给出 N 个数字,是 [1,N] 区间内整数的一个重排列,表示旅客队列。这里我们假设行李队列是按 1、2、……、N 有序的,并且行李 i 属于旅客 i。一行中数字间以空格分隔。

输出格式:

在一行中输出传送带清空需要的时间、以及旅客们的平均等待时间(输出小数点后 1 位)。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:
5
3 5 1 2 4
输出样例:
9 6.0

思路:

一看到这题,这不就是为队列准备的题吗?幸好我早有准备,哈哈哈,就不知道考试的时候运气有没有这么好了,一开始我还以为,行李会每隔一个人取(也就是一分钟)就会出来一个,但是它却一直留在那里,哈哈,和现实生活中机场不太一样。还是给我调出来了。

代码

#include<bits/stdc++.h>
using namespace std;
int b[1001]={0};
int main(){
    int n;cin>>n;queue<int>a;
    for(int i=0;i<n;i++){
        int lke;cin>>lke;
        a.push(lke);
    }
    int cnt=0,xli=1;
    while(!a.empty()){
        cnt++;
        int num=a.front();
        a.pop();//读入完就把它pop
        if(xli!=num){
            a.push(num);//不是它就让他到队尾
        }
        else{
            //cout<<num<<" "<<cnt<<endl;//调试用的
            b[num]=cnt;
            xli++;
        }
    }
    double num=0;
    for(int i=1;i<=n;i++){
        num+=b[i];
    }
    cout<<cnt<<" ";printf("%.1lf",num/n);
    return 0;
}

都读到这里了,给个推荐呗。如果您有疑问或者有更好的解法欢迎评论~

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Openfoam UPstream类探索(一) 下一篇前缀和与二维前缀和

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目