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;
}