2018年春季PAT乙级

1081 检查密码 (15分)

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    getchar();
    while(n--)
    {
        string s;
        getline(cin,s);
        if(s.size()>=6)
        {
            int no=0,hasnum=0,haseng=0;
            for(int i=0;i<s.size();i++)
            {
                if(!isalnum(s[i])&&s[i]!='.') no=1;
                if(isalnum(s[i]))
                {
                    if(isalpha(s[i]))
                    {
                        haseng=1;  //含有英文
                    }
                    else
                        hasnum=1;  //含有数字
                }
            }
            if(no==1) cout<<"Your password is tai luan le."<<endl;
            else if(!hasnum) cout<<"Your password needs shu zi."<<endl;
            else if(!haseng) cout<<"Your password needs zi mu."<<endl;
            else cout<<"Your password is wan mei."<<endl;
        }
        else
            cout<<"Your password is tai duan le."<<endl;
    }
    return 0;
}

1082 射击比赛 (20分)

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct  node
{
    string id;
    int x,y;
    int d;
}stu[10101];
bool cmp(node a,node b)
{
    return a.d<b.d;  //离靶心距离从小到大排序
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>stu[i].id>>stu[i].x>>stu[i].y;
        stu[i].d=sqrt(stu[i].x*stu[i].x+stu[i].y*stu[i].y);  //求离靶心的距离
    }
    sort(stu,stu+n,cmp);
    cout<<stu[0].id<<" "<<stu[n-1].id<<endl;
    return 0;
}

1083 是否存在相等的差 (20分)

#include<iostream>
#include<map>
#include<cmath>
using namespace std;
map<int,int,greater<int>> mp;  //map默认按键值从小到大排序,加greater<>从大到小排序 
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        mp[abs(x-i)]++;
    }
    for(auto e:mp)
    {
        if(e.second>1)   //输出重复的差值,出现一次的不输出
        cout<<e.first<<" "<<e.second<<endl;
    }
    return 0;
}

1084 外观数列 (20分)

#include<bits/stdc++.h>
using namespace std;
vector<int> v1,v2;
int main()
{
    int d,N;
    cin>>d>>N;
    v1.push_back(d);
    while(--N)
    {
        v2.clear();
        int j=0,cnt=1;
        for(j=0;j<v1.size()-1;j++)    //  0 —— size-1
        {
            if(v1[j]==v1[j+1])
            {
                cnt++;  //计算前面等于后面数字的个数
            }
            else
            {
                v2.push_back(v1[j]); //将这个数字加入到V2
                v2.push_back(cnt);   //将这个数字出现的次数加入到V2
                cnt=1;  //令 下一个数字出现次数置为1
            }
        }
        v2.push_back(v1[j]);  //加入最后一个数字
        v2.push_back(cnt);    //加入最后一个数字出现的次数
        v1=v2;
    }
    for(auto e: v1) cout<<e;
    return 0;
}

1085 PAT单位排行 (25分)

#include<bits/stdc++.h>
using namespace std;
struct node
{
    string name;
    double score;
    int num;
};
bool rule(struct node a,struct node b)
{
    if(a.score!=b.score)
        return a.score>b.score;
    else
    {
        if(a.num!=b.num)
            return a.num<b.num;
        else
            return a.name<b.name;
    }
}
map<string,struct node> mp;
int main()
{
    int n;
    cin>>n;
    int k=n;
    string id,school;
    int score;
    while(k--)
    {
        cin>>id>>score>>school;
        for(int i=0;i<school.size();i++)
        {
            if(school[i]>='A'&&school[i]<='Z')
                school[i]+=32;
        }
        if(id[0]=='A') mp[school].score+=score*1.0;
        else if(id[0]=='B') mp[school].score+=score*1.0/1.5;
        else if(id[0]=='T') mp[school].score+=score*1.5;
        mp[school].num++;
        mp[school].name=school;
    }
    vector<struct node> v;
    //v.resize(n+1);
    for(auto e: mp)
    {
        e.second.score=(int)e.second.score;
        v.push_back(e.second);
    }
    sort(v.begin(),v.end(),rule);
    int s[100000];
    for(int i=0;i<n;i++)
    {
        s[i]=i+1;
    }
    cout<<v.size()<<endl;
    for(int i=0;i<v.size();i++)
    {
        if(v[i].score==v[i+1].score)
            s[i+1]=s[i];
        cout<<s[i]<<" "<<v[i].name<<" "<<v[i].score<<" "<<v[i].num<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值