PAT 甲级
Focus9
这个作者很懒,什么都没留下…
展开
-
PAT A1003
方法:Dijkstra,求解最短距离过程中注意 路径数与点权的计算(需要分为 小于 和 等于 两种情况)另外使用邻接矩阵的话,代码量能减少#include #include #include using namespace std;int nc,nr,now,target;const int INF=100000;struct arc{ int len;原创 2017-12-30 20:47:13 · 398 阅读 · 0 评论 -
PAT A1004
对树进行广度遍历,亦即层序遍历,对每层的叶子节点计数。注意点:1,对树进行层序遍历时,不需使用vis数组;2,该段代码中在BFS的同时求各层叶子节点数,也可通过BFS求各节点的层序号,再在出队时,判断是否为叶子节点并计数#include #include #include using namespace std;const int MAXC=110;vector原创 2018-01-01 20:38:27 · 315 阅读 · 0 评论 -
PAT A1007
方法:运用动态规划,状态方程:sum[i]=max(seq[i],seq[i]+sum[i-1])注意点:均为负数的情况#include int seq[10010]={0};int sum[10010]={0};int main(){int num;scanf("%d",&num);for(int i=0;iscanf("%d",&seq[i]);原创 2018-01-01 22:42:49 · 177 阅读 · 0 评论 -
PAT A1042
注意点:数组位置=次序-1.#include int main(){ int repeat,order[54],seq[54],temp[54]; scanf("%d",&repeat); for(int i=0;i<54;i++){ scanf("%d",&order[i]); seq[i]=i; } for(int i=0;i<repeat;i++){ for(i原创 2018-01-12 10:45:32 · 182 阅读 · 0 评论 -
PAT A1001
两种思路: 1,将结果 int 数用数组存储;2,将int数转化为字符串(更优)边界情况:1,为零的情况; 2, 3n+1,3n+2位数的 逗号的输出 ; 3,负数的符号#include int main(){ int a,b; scanf("%d%d",&a,&b); int c=a+b; if(c printf("-");原创 2017-12-28 10:53:57 · 607 阅读 · 0 评论 -
PAT A1011
方法:简单模拟#include float product=1;void compare(float odd[]){if(odd[0]>odd[1]&&odd[0]>odd[2]){printf("W ");product=odd[0]*product;}else if(odd[1]>=odd[0]&&odd[1]>odd[2]){printf("T ");pr原创 2018-01-03 16:50:14 · 105 阅读 · 0 评论 -
PAT A1010
方法:运用二分法,确定是否存在最小的radix值,使两个数相等注意点:1,radix=max(digit)+1;2,运算过程中,数值可能超越long long型变量的表示范围;3,radix的最大值不止36。#include #include typedef long long ll;ll digit(char c){if(c>='0'&&celse if(c>原创 2018-01-03 16:17:15 · 386 阅读 · 0 评论 -
PAT A1009
方法:用float数组记录第一个多项式的各项值,然后输入第二个多项式时,每输入一项,对第一个多项式的数组进行一次遍历注意点:1,乘积的最高次能达到2000;2,注意float变量与int变量的区分,不要搞混;#include float poly1[1010]={0},product[2020]={0};int main(){int num1,num2,termn;原创 2018-01-02 20:18:11 · 372 阅读 · 0 评论 -
PAT A1008
方法:模拟题中的过程即可#include int main(){ int request,now=0,sum=0,num; scanf("%d",&num); for(int i=0;i scanf("%d",&request); if(request>now) sum+=(request-now)*6; else sum+=(now原创 2018-01-02 19:18:16 · 155 阅读 · 0 评论 -
PAT A1002
多项式相加方法:float/double 型数组,下标存储指数,对应元素存储系数边界情况:1,两项相加可能为零的情况;2,指数的范围为0至1000,防止数组越界;3,两项相加不为零的情况#include float poly[1010]={0}; int main(){ int len1,len2,lenr; scanf("%d",&len1)原创 2017-12-28 11:43:34 · 268 阅读 · 0 评论 -
PAT A1043
方法:递归检测先序序列,是否满足排序二叉树的特性。注意点:1,the mirror image of BST; 2,数值等于根节点的情况。#include #include using namespace std;struct node{ int lchild,rchild,value;};int index=0,pre[1010],in[1010],num,tag=1;no原创 2018-01-12 15:32:00 · 453 阅读 · 0 评论 -
PAT A1012
方法:用sort排序注意点:1,成绩相等时的排名处理;2,科目的优先级处理#include #include using namespace std;struct student{ int rank[4]; float score[4]; int id;};const int maxn=1000010;bool hasha[maxn]={0};student stu原创 2018-01-03 20:51:42 · 276 阅读 · 0 评论 -
PAT A1013
方法:用DFS/BFS求连通分量的个数注意点:1,需要的路径数等于连通分量减一;2,vis数组需要重置#include #include using namespace std;int N,M,K;bool arc[1010][1010]={0};bool vis[1010]={0};void DFS(int root){ vis[root]=true; for(int原创 2018-01-03 21:56:51 · 437 阅读 · 0 评论 -
PAT A1005
方法:(int数组与char数组的相互转化)将字符数组的各个数值相加得到sum,然后将sum利用to_string函数转化为由高位到低位的字符串,便于输出。边界情况:1, N#include #include using namespace std;char name[10][6]={"zero","one","two","three","four","five","six原创 2017-12-28 17:06:39 · 216 阅读 · 0 评论 -
PAT A1046
#include #include using namespace std;int dis[100010]={0},N,M;int main(){ scanf("%d",&N); int sum=0,e1,e2; for(int i=1;i<=N;i++){ scanf("%d",&dis[i]); sum+=dis[i]; dis[i]+=dis[i-1]; //因原创 2018-01-12 22:20:13 · 205 阅读 · 0 评论 -
PAT A1045
方法:动态规划,状态方程len[i]=max(len[i],len[j]+1), 其中j在位置i之前,即j#include using namespace std;const int maxn=10010;int numc,M,L,forder[210],origin[10010]={0},prior[210]={0},maxlen=0,len[maxn]={0};//prior表示最原创 2018-01-13 11:21:00 · 307 阅读 · 0 评论 -
PAT A1006
方法:边输入边遍历边界情况:时间的所在区间【0,24*3600,)#include #include struct person{ char id[20];}; int main(){ int h1,h2,m1,m2,s1,s2,pnum; person idt,minid,maxid; int min=24*3600,max=-1;原创 2017-12-28 17:49:01 · 187 阅读 · 0 评论 -
PAT A1047
方法:利用map,vector容器数据分类后,作排序。#include #include #include #include using namespace std;int N,K;map > coursetostu;int change(char str[]){ int sum=0; for(int i=0;i<3;i++) sum=26*sum+(str[i]-'A'原创 2018-01-13 15:55:41 · 340 阅读 · 0 评论 -
PAT A1048
方法:先作排序,然后利用双指针分别指向首位元素,根据两元素之和与所求值的大小关系移动指针并最终得到答案。#include #include using namespace std;int N,M,coin[100010]={0};int main(){ scanf("%d%d",&N,&M); for(int i=0;i<N;i++) scanf("%d",&coin[i]);原创 2018-01-13 16:10:27 · 194 阅读 · 0 评论 -
PAT A1014
方法:模拟分为三个部分:1,将顾客放满等待区;2,模拟顾客进入等待区;3,最后一批顾客的时间处理,即17:00之前必须到达窗口的队首。注意点:1,17:00之前未到达窗口队首的情况;2,17:00之前到达窗口队首,但服务时间超过17:00。#include #include using namespace std;int numw,numl,numc,numq; //分别是窗口数原创 2018-01-04 17:40:55 · 301 阅读 · 0 评论 -
PAT A1050
#include #include using namespace std;bool hashtable[200]={0};int main(){ string s1,s2; getline(cin,s1); getline(cin,s2); for(int i=0;i<s2.size();i++){ if(s2[i]>='A'&&s2[i]<='Z') hashtable[s原创 2018-01-14 11:18:43 · 178 阅读 · 0 评论 -
PAT A1037
方法:贪心,用双指针指向数组首位,均为正,则相乘并加至总的结果;然后再取末位,反向遍历,均为负,则相乘并加至总的结果。注意:总的结果会超过int表示范围。#include #include using namespace std;int c[100010],p[100010];int main(){ int nc,np; long long sum=0; scanf("%原创 2018-01-10 12:00:56 · 213 阅读 · 0 评论 -
PAT A1016
方法:排序,输出有效数据注意点:1,电话记录跨天的情况;2,注意无效数据,无效数据不输出任何内容。#include #include #include using namespace std;int cost[24],numr,daycost=0;struct record{ char name[23]; int mo,d,h,mi,flag;};record rec[101原创 2018-01-04 22:00:54 · 372 阅读 · 0 评论 -
PAT A1052
方法:先用遍历确定有效结点,再排序,输出有效结点。注意点:有效结点为零的情况。#include #include using namespace std;struct node{ int address,data,flag,next; node(){ flag=0; }}no[100010];bool cmp(node a,node b){ return a.flag原创 2018-01-14 16:49:13 · 243 阅读 · 0 评论 -
PAT A1053
方法:深度遍历,记录路径的点权值及点权之和。#include #include #include using namespace std;int N,M,S,weight[105]={0};vector child[105];bool cmp(int a,int b){ return weight[a]>weight[b];}vector wpath;void DFS(in原创 2018-01-14 17:32:12 · 401 阅读 · 0 评论 -
PAT A1054
#include int M,N,dominant,freq=0,temp;int main(){ scanf("%d%d",&M,&N); for(int i=0;i<N;i++){ for(int j=0;j<M;j++){ scanf("%d",&temp); if(freq==0){ dominant=temp; freq=1; }else{原创 2018-01-14 19:33:29 · 201 阅读 · 0 评论 -
PAT A1055
方法:排序,然后依据限制条件输出。#include #include #include using namespace std;struct rich{ char name[10]; int age,worth;}ri[100010];bool cmp(rich a,rich b){ if(a.worth!=b.worth) return a.worth>b.worth;原创 2018-01-14 20:14:45 · 238 阅读 · 0 评论 -
PAT A1079
方法:BFS。注意:price需使用double变量,用float变量精确度不够,不能全通过。#include #include #include using namespace std;const int maxn=100010;double price[maxn],product[maxn],increment,sum=0;vector child[maxn];int原创 2018-01-19 17:52:33 · 278 阅读 · 0 评论 -
PAT A1057
方法:运用分块与哈希的思想,用block和hashtable分别记录每块与每个数的数据个数。#include #include using namespace std;int hashtable[100010]={0},block[320]={0};int main(){ int N,temp; stack s; char str[20]; scanf("%d",&N); w原创 2018-01-15 12:46:11 · 190 阅读 · 0 评论 -
PAT A1018
方法:应用dijkstra算法算出单源路径,并用pre(vector容器)记录其路径,然后利用深度遍历,计算不同路径的需要带出的单车数和带回的单车数,找到最优解并输出。注意点:1,三个关键字优先级:路径长短,带出的单车数,带回的单车数;2,path深度遍历时,记得添加pop_back。#include #include #include using namespace std;co原创 2018-01-05 21:56:50 · 553 阅读 · 0 评论 -
PAT A1019
方法:运用整除,取余将整数转化为数组,比较并确定是否为回文数。注意点:N=0的情况#include int main(){ int N,base,a[30]={0},index=0; scanf("%d%d",&N,&base); while(N){ a[index++]=N%base; N=N/base; } bool ans=true; for(int i=0;i<原创 2018-01-05 22:04:38 · 345 阅读 · 0 评论 -
PAT A1081
#include typedef long long ll;ll gcd(ll a,ll b){ if(b==0) return a; return gcd(b,a%b);}struct rational{ ll nu,de;}r1,r2;void print(rational r){ ll g=gcd(r.nu,r.de); // r.nu/=g; r.de/=g;原创 2018-01-23 10:46:40 · 199 阅读 · 0 评论 -
PAT A1058
注意点:用int变量可能会溢出。#include int main(){ long long a1,b1,c1,a2,b2,c2; scanf("%lld.%lld.%lld %lld.%lld.%lld",&a1,&b1,&c1,&a2,&b2,&c2); long long sum=(a1*29*17+b1*29+c1)+(a2*29*17+b2*29+c2); printf(原创 2018-01-15 17:14:57 · 205 阅读 · 0 评论 -
PAT A1082
注意点:1,中间位为零的情况处理(可能输出ling,可能不需要输出ling);2,负号的处理;3,结果为零的处理;4,空格的处理。#include #include using namespace std;char cnumber[10][8]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};char digit[5][原创 2018-01-23 15:40:33 · 234 阅读 · 0 评论 -
PAT A1059
方法:先获取质数的hash表,再对N进行从小到大的整除。注意点:N=1。#include typedef long long ll;const int maxn=100010;bool isPrime[maxn]={0};void init(){ for(int i=2;i<maxn;i++){ if(!isPrime[i]){ for(int j=2*i;j<maxn原创 2018-01-15 17:56:02 · 111 阅读 · 0 评论 -
PAT A1020
方法:利用中序遍历和后序遍历找到根节点,左子树和右子树建树,然后利用queue进行层序遍历#include #include using namespace std;struct node{ int lchild,rchild,v;};node tree[50];int post[50],in[50],num,index=-1;int createtree(int postL,in原创 2018-01-06 18:04:29 · 151 阅读 · 0 评论 -
PAT A1021
方法:广度遍历,若图不是连通图,则返回连通分量的个数注意点:图的广度遍历需要vis数组,且入队后即修改vis数组值,树可不用#include #include #include #include using namespace std;const int maxn=10010;vector arc[maxn];bool vis[maxn];int N,depth[maxn]原创 2018-01-06 20:06:08 · 324 阅读 · 0 评论 -
PAT A1083
#include #include using namespace std;struct stu{ char name[12],id[12]; int grade;}st[1010];bool cmp(stu a,stu b){ return a.grade>b.grade;}int main(){ int N,low,high,counts=0; scanf("%d",&原创 2018-01-23 17:24:02 · 170 阅读 · 0 评论 -
PAT A1084
#include #include bool keyboard[200]={0},print[200]={0};int main(){ char str1[100],str2[100]; scanf("%s",str1); int len1=strlen(str1); for(int i=0;i<len1;i++){ if(str1[i]='a') str1[i]-=('a'-'原创 2018-01-23 17:27:10 · 189 阅读 · 0 评论 -
PAT A1085
注意:两个int数相乘,结果可能越界。#include #include using namespace std;long long seq[100010]={0};int main(){ int N,pratio,maxlen=1; scanf("%d%d",&N,&pratio); for(int i=0;i<N;i++) scanf("%lld",&seq[i]);原创 2018-01-23 17:53:10 · 168 阅读 · 0 评论