PAT 1009-1012 <Product of Polynomials> <Radix> <World Cup Betting> <The Best Rank>

1009 Product of Polynomials

分析

基础题(模拟题),随便用什么办法,能做对就好

代码

//
//  main.cpp
//  PAT-testcpp
//
//  Created by hwl on 2021/1/15.
//

#include<bits/stdc++.h>
using namespace std;
struct node{
    double coef; //系数
    int expo;   //幂
};

int main()
{
    int n;
    cin>>n;
    vector<node> A;
    vector<node> B;
    while(n--)
    {
        node tmp;
        cin>>tmp.expo;cin>>tmp.coef;
        A.push_back(tmp);
    }
    cin>>n;
    while(n--)
    {
        node tmp;
        cin>>tmp.expo;cin>>tmp.coef;
        B.push_back(tmp);
    }
    double C[3001]={0};
    int vis[3001]={0};
    int sum = 0;
    for(int i=0;i<A.size();i++)
        for(int j=0;j<B.size();j++)
        {
            //cout<<A[i].coef*B[j].coef<<endl;
            C[A[i].expo+B[j].expo] += A[i].coef*B[j].coef;
            if(!vis[A[i].expo+B[j].expo])
            {
                sum++;
                vis[A[i].expo+B[j].expo]=1;
            }
            if(abs(C[A[i].expo+B[j].expo])<0.0000001)
            {
                sum--;
                vis[A[i].expo+B[j].expo]=0;
            }
        }
    cout<<sum;
    for(int i=2000;i>=0;i--)
    {
        if(vis[i])
        {
            cout<<" "<<i<<" ";
            printf("%.1f",C[i]);
        }
    }
    cout<<endl;
    return 0;
}

1010 Radix

分析

这题也是基础题,但是一些细节的考察比较偏
这道题如果用暴力的方式来做的话,其实也就三个case过不了,从考试的角度来说,拿到22分就可以了

要全过的话
注意点:

1.要用二分法来解决查找超时的问题(这思路经常用到)
2.保证二分法的区间合理

首先是最小值(i)的确定:

k进制下最大值就是k-1,所以不要乱取i=1

其次是最大值(j)的确定:

首先保证大于最小值,然后最大也不可能超过n1的十进制,除非是1

3.要用long long类型,而且用long long也可能越界,这是我最讨厌的地方,题目也不给出范围来,只能去猜测
4.对于题目的要求:输出smallest的情况:

我觉得除了1之外,其余的情况十进制数的大小都是随着进制数增加严格递增的,1本身不受到进制数的影响(不讨论0)

也就是说如果二分找到了一个相等的情况,直接退出循环就好
(1这种情况作为特殊情况刚好也满足代码的输出)

(对于考试来说这样得不偿失,本身这题一些情况也没说明清楚)

代码

//
//  main.cpp
//  PAT-testcpp
//
//  Created by hwl on 2021/1/15.
//
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll trans2deci(string str,ll radix){
    ll deci = 0;
    reverse(str.begin(),str.end());
    for(int i=0;i<str.size();i++)
        deci += pow(radix,i)*(str[i]<='9'?str[i]-'0':str[i]-'a'+10);
    return deci;
}

int main()
{
    string n1,n2;
    ll tag,radix;
    cin>>n1>>n2>>tag>>radix;
    if(tag==2)
        swap(n1,n2);
    
    //将已知的n1转为十进制
    
    ll deci_n1 = trans2deci(n1,radix);
    
    //二分法
    //找出n2中最大的digit
    int maxnum=-1;
    for(int i=0;i<n2.size();i++)
        maxnum = max(maxnum,(n2[i]<='9'?n2[i]-'0':n2[i]-'a'+10));
    
    //保证区间是合理的
    ll i=1+maxnum;ll j = max(i,deci_n1);
    ll ans;
    while(i<=j)
    {   ll mid = (i+j)/2;
        ll deci_n2 =trans2deci(n2,mid);
        if(deci_n2>deci_n1||deci_n2<0) //deci_n2可能会越界而小于0,这种情路是进制太大了
            j=mid-1;
        else if(deci_n2==deci_n1)
        {
            ans = mid;
            break;
        }
        else{
            i=mid+1;
        }
    }
    if(i>j)
     cout<<"Impossible"<<endl;
    else cout<<ans<<endl;
    return 0;
}



1011 World Cup Betting

分析

伤害不高,侮辱性挺强

代码

//
//  main.cpp
//  PAT-testcpp
//
//  Created by hwl on 2021/1/15.
//
#include<bits/stdc++.h>
using namespace std;

int main()
{
    char arr[3] = {'W','T','L'};
    double maxnum;
    double ans = 1;
    vector<char> ans_char;
    int cnt;
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++)
        {
            double tmp;cin>>tmp;
            if(maxnum<tmp)
            {
                maxnum = tmp;
                cnt = j;
            }
        }
        ans_char.push_back(arr[cnt]);
        ans*=maxnum;
        maxnum = 0;
        cnt = 0;
    }
    for(int i=0;i<ans_char.size();i++)
        cout<<ans_char[i]<<" ";
    printf("%.2f",(ans*0.65-1)*2);
    return 0;
}




1012 The Best Rank

分析

基础题,考察点可能就是模拟SQL建一个索引表

注意分数并列的情况就好

代码

//
//  main.cpp
//  PAT-testcpp
//
//  Created by hwl on 2021/1/15.
//
#include<bits/stdc++.h>
using namespace std;
struct node{
    string ID;
    int c;
    int m;
    int e;
    int a;
};
int cmp_c(node a,node b){
    return a.c>b.c;
}
int cmp_m(node a,node b){
    return a.m>b.m;
}
int cmp_e(node a,node b){
    return a.e>b.e;
}
int cmp_a(node a,node b){
    return a.a>b.a;
}

int main()
{
    int n,m;
    cin>>n>>m;
    vector<node> stus(n);
    vector<string> query(m);
    for(int i=0;i<n;i++)
    {
        cin>>stus[i].ID>>stus[i].c>>stus[i].m>>stus[i].e;
        stus[i].a=(stus[i].c+stus[i].m+stus[i].e)/3;
    }
    for(int i=0;i<m;i++)
    {
        cin>>query[i];
    }
    //构建索引表
    vector<node> stus_index_c;stus_index_c.assign(stus.begin(),stus.end());
    vector<node> stus_index_m;stus_index_m.assign(stus.begin(),stus.end());
    vector<node> stus_index_e;stus_index_e.assign(stus.begin(),stus.end());
    vector<node> stus_index_a;stus_index_a.assign(stus.begin(),stus.end());
    sort(stus_index_c.begin(),stus_index_c.end(),cmp_c);
    sort(stus_index_m.begin(),stus_index_m.end(),cmp_m);
    sort(stus_index_e.begin(),stus_index_e.end(),cmp_e);
    sort(stus_index_a.begin(),stus_index_a.end(),cmp_a);
    
    map<string,int> mapa;
    map<string,int> mapc;
    map<string,int> mapm;
    map<string,int> mape;
    
    for(int i=0;i<n;i++)
    {
        if(i>0&&stus_index_a[i].a==stus_index_a[i-1].a)
            mapa[stus_index_a[i].ID]=mapa[stus_index_a[i-1].ID];
        else
            mapa[stus_index_a[i].ID]=i;
        
        if(i>0&&stus_index_c[i].c==stus_index_c[i-1].c)
            mapc[stus_index_c[i].ID]=mapc[stus_index_c[i-1].ID];
        else
            mapc[stus_index_c[i].ID]=i;
        
        if(i>0&&stus_index_m[i].m==stus_index_m[i-1].m)
            mapm[stus_index_m[i].ID]=mapm[stus_index_m[i-1].ID];
        else
            mapm[stus_index_m[i].ID]=i;
        
        if(i>0&&stus_index_e[i].e==stus_index_e[i-1].e)
            mape[stus_index_e[i].ID]=mape[stus_index_e[i-1].ID];
        else
            mape[stus_index_e[i].ID]=i;
    }
    //处理查询请求
    for(int i=0;i<query.size();i++)
    {
        //首先判断是否存在
        if(mapa.count(query[i])==0){
            cout<<"N/A"<<endl;
            continue;
        }
        int best_rank = n+1;char course;
        //按照A C M E的顺序查询
        if(best_rank>mapa[query[i]])
        {
            best_rank =mapa[query[i]];
            course = 'A';
        }
        if(best_rank>mapc[query[i]])
        {
            best_rank =mapc[query[i]];
            course = 'C';
        }
        if(best_rank>mapm[query[i]])
        {
            best_rank =mapm[query[i]];
            course = 'M';
        }
        if(best_rank>mape[query[i]])
        {
            best_rank =mape[query[i]];
            course = 'E';
        }
        cout<<best_rank+1<<" "<<course<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值