PAT入门刷题记录(一)
2020.1.15-2020.1.16
Advance Level
1001 A+B Format
题意:
输入两个数进行加法,结果按照每三位一个逗号进行标准输出,数据量小,可以暴力,也可以使用边计算边输出。
1002 A+B for Polynomials
题意:
两个多项式相加。可以使用map(也可以暴力用两个指针轮着扫)。悄悄贴npy给的代码。
#include <cstdio>
#include <map>
#include <vector>
#include <cmath>
using namespace std;
map<int,double>f;
int k; int n; double an;
int main(){
scanf("%d",&k);
for(int i=1;i<=k;++i){
scanf("%d %lf",&n,&an);
f[-n]+=an;//小技巧 题目从大到小输出 输入从小到大 map自动排序
}
scanf("%d",&k);
for(int i=1;i<=k;++i){
scanf("%d %lf",&n,&an);
f[-n]+=an;
}
vector<int>memo;
for(auto t:f){//删去0的情况
if(abs(t.second)<=1e-7) memo.push_back(t.first);
}
for(auto t:memo){
f.erase(t);
}
printf("%d",f.size());
for(auto t:f){
int n=-t.first;
double an=t.second;
printf(" %d %.1lf",n,an);
}
return 0;
}
1003 Emergency
迪杰斯特拉的应用。
从源点出发,每次走距离源点最近的点。(贪心)
这篇博客写的很好!
https://blog.csdn.net/wang13342322203/article/details/89377256
#include<bits/stdc++.h>
using namespace std;
#define mem(a) memset(a,0,sizeof(a))
const int maxn=550;
const int INF=99999999;
struct node{
int v;
int cost;
};
int d[maxn];//距离(从已知源点到某点的距离)
int sum[maxn];//条数
int num[maxn];//最大人数
int cnt[maxn];//人数
int mark[maxn];//标记
vector<node>adj[maxn];
void dijkstra(int s,int n){
fill(d,d+n,INF);
mem(sum);
mem(num);
mem(mark);
d[s]=0;
num[s]=cnt[s];
sum[s]=1;
for(int i=0;i<n;i++){
int u=-1,min=INF;
for(int v=0;v<n;v++){
if(!mark[v] && d[v]<min){//找到一个没有加入s且最近的点
min=d[v];
u=v;
}
}
if(u==-1) return;
mark[u]=1;
for(int i=0;i<adj[u].size();i++){
int id=adj[u][i].v;
if(!mark[id] && d[u]+adj[u][i].cost<d[id]){//存在通路或者间接到达更近则更新
d[id]=d[u]+adj[u][i].cost;
num[id]=num[u]+cnt[id];
sum[id]=sum[u];
}
else if(!mark[id] && d[u]+adj[u][i].cost==d[id]){//距离等价
sum[id]=sum[id]+sum[u];
if(num[u]+cnt[id]>num[id]){//到达救援队可以更多
num[id]=num[u]+cnt[id];
}
}
}
}
}
int main(){
int n,m,c1,c2;
scanf("%d%d%d%d",&n,&m,&c1,&c2);
for(int i=0;i<n;i++){
cin>>cnt[i];
}
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
node n1,n2;
n1.v=b;
n1.cost=c;
adj[a].push_back(n1);//无向图
n2.v=a;
n2.cost=c;
adj[b].push_back(n2);
}
dijkstra(c1,n);
cout<<sum[c2]<<" "<<num[c2]<<endl;//注意区分几个数组的意义,刚开始输出错了卡的想打人
}
/*
3 1 0 1
1 2 3
1 2 1
0 2
*/
1005 Spell It Right
map的应用
#include<bits/stdc++.h>
using namespace std;
map<int,string> alph;
int main(){
alph[0]="zero";
alph[1]="one";
alph[2]="two";
alph[3]="three";
alph[4]="four";
alph[5]="five";
alph[6]="six";
alph[7]="seven";
alph[8]="eight";
alph[9]="nine";
string n;
int sum=0;
int a[1000];
cin>>n;
int l=n.length();
for(int i=0;i<l;i++){
sum+=(n[i]-'0');
}
//cout<<sum;
int j=0;
while(sum>=1){
//cout<<sum%10<<' ';
a[j++]=sum%10;
//cout<<a[j-1]<<' ';
sum/=10;
}
j--;
cout<<alph[a[j]];
for(j=j-1;j>=0;j--){
cout<<' '<<alph[a[j]];;
}
cout<<endl;
}
1007 Maximum Subsequence Sum
暴力也能过,写了个动态规划的。
#include<bits/stdc++.h>
using namespace std;
int a[10010];
int dp[10010];
int main(){
//std::ios::sync_with_stdio(false);
int k,maxn=-1,s,e;
cin>>k;
for(int i=0;i<k;i++){
scanf("%d",&a[i]);
}
int temp=0;
//int maxn=0;
temp=dp[0]=a[0];//把temp初始a[0]也是为了k=1,防止不计算
for(int i=0;i<k;i++){//卡了很久的一个点是k=1的时候,如果从i=1开始,则k=1无法进行计算
if(i) dp[i]=dp[i-1]+a[i];
if(dp[i]<a[i]){//一旦从某个地方开始,更新起点
temp=a[i];
dp[i]=a[i];
}
if(dp[i]>maxn){//大于当前的最大值,更新起点和终点
maxn=dp[i];
s=temp;
e=a[i];
}
}
if(maxn>=0) printf("%d %d %d\n",maxn,s,e);
else printf("0 %d %d\n",a[0],a[k-1]);
}
1008 Elevator
小学数学题?
1009 Product of Polynomials
跟1002几乎一样注意更改细节就好啦!
#include<bits/stdc++.h>
using namespace std;
map<int,double>f1;
map<int,double>f2;
int main(){
int k;
cin>>k;
int t;
double an;
for(int i=0;i<k;i++){
cin>>t>>an;
f1[-t]+=an;
}
cin>>k;
for(int i=0;i<k;i++){
cin>>t>>an;
for(auto j:f1){
int temp1;
temp1=-j.first;
//printf("%d %d ",t,temp1);
double temp2;
temp2=j.second;
temp1+=t;
//printf("%d %d ",t,temp1);
f2[-temp1]+=(temp2*an);
}
}
vector<int>del;
for(auto j:f2){
if(j.second==0) del.push_back(j.first);
}
for(auto i:del){
f2.erase(i);
}
cout<<f2.size();
for(auto j:f2){
cout<<" ";
int i=-j.first;
an=j.second;
cout<<i<<" "<<fixed<<setprecision(1)<<an;
}
cout<<endl;
}
1011 非常简单。略。
1054 The Dominant Color
讲来讲去就是找众数。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
unordered_map<ll,int>f;
int main(){
int m,n,maxn=0,maxt=0;
cin>>m>>n;
for(int j=0;j<n;j++){
for(int i=0;i<m;i++){
ll t;
cin>>t;
f[t]+=1;
if(f[t]>maxn){
maxn=f[t];
maxt=t;
}
}
}
cout<<maxt<<endl;
}