PAT甲级入门刷题记录(一)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值