PAT甲级考前整理一:https://www.cnblogs.com/jlyg/p/7525244.html,主要讲了131题的易错题及坑点

PAT甲级考前整理二:https://www.cnblogs.com/jlyg/p/10364696.html,主要讲了考前注意以及一些常用算法。

1132题:用字符串接收会毕竟快,使用atoi函数转成数字,注意a*b会超出int32。

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std; int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif
int t;
scanf("%d",&t);
while(t--)
{
char str[];
scanf("%s",str);
char str1[],str2[];
int len = strlen(str);
strncpy(str1,str,len/);
str1[len/]='\0';
strcpy(str2,str+len/);
int a = atoi(str1),b=atoi(str2);
int c = atoi(str);
//a*b超出int32
if(a*b<=||c%(a*b)) printf("No\n");
else printf("Yes\n");
}
return ;
}

1133题:因为k是正数,用3个vector存储就ok了,v0表示存储负数,v1表示存储小于等于k的,v2表示存储大于k的。

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std;
#define N (100010)
struct ST
{
int addr;
int val;
int next;
};
ST sts[N];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif
int startaddr,n,k;
scanf("%d%d%d",&startaddr,&n,&k);
for(int i=;i<n;++i)
{
ST st;
scanf("%d%d%d",&st.addr,&st.val,&st.next);
sts[st.addr] = st;
}
vector<ST> vs;
for(int addr=startaddr;addr!=-;addr=sts[addr].next)
vs.push_back(sts[addr]);
vector<ST> vs0/*负数*/,vs1/*比k小或等于的正数*/,vs2/*比k大的正数*/;
for(int i=;i<vs.size();++i)
{
if(vs[i].val < ) vs0.push_back(vs[i]);
else if(vs[i].val<=k) vs1.push_back(vs[i]);
else if(vs[i].val>k) vs2.push_back(vs[i]);
} {
vs = vs0;
for(int i=;i<vs1.size();++i) vs.push_back(vs1[i]);
for(int i=;i<vs2.size();++i) vs.push_back(vs2[i]); for(int i=;i<vs.size();++i)
{
if(i!=vs.size()-)
printf("%05d %d %05d\n",vs[i].addr,vs[i].val,vs[i+].addr);
else
printf("%05d %d -1\n",vs[i].addr,vs[i].val);
}
} return ;
}

1134题:题意有点难懂,顶点覆盖,即所有边的(边有两个顶点,任一一个顶点)某个顶点必须是在已给的顶点集合中。如果用遍历会超时,所以要用hash的想法。

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std;
#define N (10010)
struct Edge //记录边的两个端点
{
int a;
int b;
};
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif
int n,m;
vector<Edge> ve;
scanf("%d%d",&n,&m);
for(int i=;i<m;++i)
{
Edge edge;
scanf("%d%d",&edge.a,&edge.b);
ve.push_back(edge);
}
int k;
scanf("%d",&k);
while(k--)
{
int nv;
scanf("%d",&nv);
bool flag = true;//是否是顶点覆盖
bool V[N];
memset(V,,sizeof(V)); //下标表示定点,值表示是否有无改点
for(int i=;i<nv;++i)
{
int a;
scanf("%d",&a);
V[a] = true;
} for(int i=;i<ve.size();++i)
{
flag = V[ve[i].a]||V[ve[i].b];
if(flag==false)
break;
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return ;
}

1135题:红黑树的题目,给出先序(插入顺序)构造红黑树,然后判断是否是红黑树。可以看我写的另一篇博客:

https://www.cnblogs.com/jlyg/p/7542409.html

1136题:简单题,大数加法加字符串反转

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std;
string Add(string str1,string str2)
{
int len = str1.length();
int add = ;
string res = "";
for(int i=len-;i>=;--i)
{
int k = str1[i]-''+str2[i]-'' + add;
add = k/;
res += (k%+'');
}
if(add) res += (add+'');
reverse(res.begin(),res.end());
return res;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
char temp[];
scanf("%s",temp);
string str = temp,str2=temp;
for(int i=;i<;++i)
{
reverse(str2.begin(),str2.end());
if(strcmp(str.c_str(),str2.c_str())==)
{
printf("%s is a palindromic number.\n",str.c_str());
return ;
}
string str3 = Add(str,str2);
printf("%s + %s = %s\n",str.c_str(),str2.c_str(),str3.c_str());
str = str2 = str3;
}
printf("Not found in 10 iterations.\n");
return ;
}

1137题:简单题,Gm若是大于Gf,则G=(0.4*Gm+0.6*Gf+0.5),否则G = Gf; Gp<200和G<60的不记录。

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std;
struct ST
{
string id;
int Gp;
int Gm;
int Gf;
int G;
ST(){Gp=Gm=Gf=G=-;}
void UpdateG()
{
if(Gm > Gf) G = int(Gm*0.4f+Gf*0.6f+0.5f);
else G = Gf;
}
bool IsUseful()
{
if(Gp<) return false;
if(G<) return false;
return true;
}
};
int cmp(const ST& st1,const ST& st2)
{
if(st1.G != st2.G) return st1.G>st2.G;
return strcmp(st1.id.c_str(),st2.id.c_str())<;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE int p,m,n;
scanf("%d%d%d",&p,&m,&n);
map<string,ST> mss;
for(int i=;i<p;++i)
{
char strid[];
int g;
scanf("%s%d",strid,&g);
mss[strid].Gp = g;
mss[strid].id = strid;
}
for(int i=;i<m;++i)
{
char strid[];
int g;
scanf("%s%d",strid,&g);
mss[strid].Gm = g;
mss[strid].id = strid;
}
for(int i=;i<n;++i)
{
char strid[];
int g;
scanf("%s%d",strid,&g);
mss[strid].Gf = g;
mss[strid].id = strid;
}
vector<ST> vs;
for(map<string,ST>::iterator it = mss.begin();it!=mss.end();it++)
{
it->second.UpdateG();
if(it->second.IsUseful())
vs.push_back(it->second);
}
sort(vs.begin(),vs.end(),cmp);
for(int i=;i<vs.size();++i)
{
printf("%s %d %d %d %d\n",vs[i].id.c_str(),vs[i].Gp,vs[i].Gm,vs[i].Gf,vs[i].G);
}
return ;
}

1138题:简单题,先序和中序求后序第一个元素的值。

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std;
int FindFirst(int* pre,int* inorder,int n)
{
if(n==) return *pre;
int val = *pre;
int iIndex;
for(iIndex=;iIndex<n;++iIndex)
{
if(val == inorder[iIndex])
{
break;
}
}
if(iIndex>)
{
return FindFirst(pre+,inorder,iIndex);
}
else
{
return FindFirst(pre+iIndex+,inorder+iIndex+,n-iIndex-);
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
int n;
scanf("%d",&n);
int pre[n],inorder[n];
for(int i=;i<n;++i)
scanf("%d",&pre[i]);
for(int i=;i<n;++i)
scanf("%d",&inorder[i]);
printf("%d\n",FindFirst(pre,inorder,n));
return ;
}

1139题:有点难度,注意两点:1)0000是男生,-0000是女生。2)使用递归dfs最后一个case会超时,老老实实写几层循环去遍历吧!

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std;
#define N (10010)
int cmp(const vector<int>& v1,const vector<int>& v2)
{
if(v1[] != v2[]) return v1[] < v2[];
return v1[] < v2[];
}
vector<int> vssame[N]; //相同
vector<int> vsdif[N]; //不同
bool bVis[N];
int thepeo1,thepeo2;
bool bSame;
vector<vector<int> > res;
void dfs()
{
res.clear();
memset(bVis,,sizeof(bVis));
bVis[thepeo1] = true;
for(int i=;i<vssame[thepeo1].size();++i)
{
int id1 = vssame[thepeo1][i];
//printf("1:%04d\n",id1);
if(!bVis[id1]&&id1!=thepeo2)
{
bVis[id1] = true;
vector<int> *pvs;
if(bSame) pvs = &(vssame[id1]);
else pvs = &(vsdif[id1]);
for(int j=;j<pvs->size();++j)
{
int id2 = (*pvs)[j];
//printf(" 2:%04d\n",id2);
if(!bVis[id2]&&id2!=thepeo2)
{
bVis[id2] = true;
for(int k=;k<vssame[id2].size();++k)
{
int id3 = vssame[id2][k];
//printf(" 3:%04d\n",id3);
if(id3==thepeo2)
{
vector<int> vi;
vi.push_back(id1);
vi.push_back(id2);
res.push_back(vi);
break;
}
}
bVis[id2] = false;
} }
bVis[id1] = false;
}
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<m;++i)
{
char str1[],str2[];
scanf("%s%s",str1,str2);
int id1 = abs(atoi(str1)),id2=abs(atoi(str2));
if(str1[]=='-'&&str2[]=='-'
||str1[]!='-'&&str2[]!='-')
{
vssame[id1].push_back(id2);
vssame[id2].push_back(id1);
}
else
{
vsdif[id1].push_back(id2);
vsdif[id2].push_back(id1);
}
}
int t;
scanf("%d",&t);
while(t--)
{
char str1[],str2[];
scanf("%s%s",str1,str2);
if(str1[]=='-'&&str2[]=='-'||str1[]!='-'&&str2[]!='-')
{
bSame = true;
}
else
{
bSame = false;
}
thepeo1 = abs(atoi(str1));
thepeo2 = abs(atoi(str2));
dfs();
sort(res.begin(),res.end(),cmp);
printf("%d\n",res.size());
for(int i=;i<res.size();++i)
{
vector<int>& vi = res[i];
for(int j=;j<vi.size();++j)
{
if(j) printf(" ");
printf("%04d",vi[j]);
}
printf("\n");
}
}
return ;
}

1140题:题意很难理解。。。一句话后面数字是前面数字的描述。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<string>
#include<algorithm>
using namespace std;
string getstr(string str)
{
string res="";
int len = str.length();
char c= str[],cnt=;
for(int i=;i<len;++i)
{
if(c==str[i]) ++cnt;
else if(c!=str[i])
{
res += c;
char strcnt[];
sprintf(strcnt,"%d",cnt);
res +=strcnt;
c = str[i];
cnt = ;
}
if(i==len-)
{
res += c;
char strcnt[];
sprintf(strcnt,"%d",cnt);
res +=strcnt;
}
}
return res;
}
//题意:后面的数字是对前面数字的描述
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
char a[];
int n;
scanf("%s%d",&a,&n);
string str = a;
for(int i=;i<n;++i)
str=getstr(str);
printf("%s\n",str.c_str());
return ;
}

1142题:要求最大团:团是一组顶点,每个顶点两两可以组成边,最大团就是没有另外一个顶点与团里的点都能组成边。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
#define N (250)
int Map[N][N];
int nv,ne;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
scanf("%d%d",&nv,&ne);
for(int i=;i<ne;++i)
{
int a,b;
scanf("%d%d",&a,&b);
Map[a][b] = Map[b][a] = ;
}
int t;
scanf("%d",&t);
while(t--)
{
int k;
scanf("%d",&k);
int a[k];
for(int i=;i<k;++i)
scanf("%d",&a[i]);
bool bClique = true;
for(int i=;i<k;++i)
for(int j=;j<k;++j)
{
//要求每条边两两相交
if(i!=j&&Map[a[i]][a[j]]==)
{
bClique = false;
break;
}
}
if(bClique)
{
bool bMax = true;
for(int i=;i<=nv;++i)
{
int j;
for(j=;j<k;++j)
{
if(Map[i][a[j]]==)
break;
}
if(j==k)
{
bMax = false;
break;
}
}
if(bMax) printf("Yes\n");
else printf("Not Maximal\n");
}
else printf("Not a Clique\n");
}
return ;
}

1143题:用map存储出现过的点,用于判断是否点存在。通过遍历先序,第一个出现满足a,b在val左右两边的就是他们的父节点。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
map<int,bool> Map;
int m,n;
scanf("%d%d",&m,&n);
int pre[n];
for(int i=;i<n;++i)
{
scanf("%d",&pre[i]);
Map[pre[i]] = true;
}
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
bool aexits = Map[a],bexits = Map[b];
if(!aexits&&!bexits) printf("ERROR: %d and %d are not found.\n",a,b);
else if(aexits&&bexits)
for(int i=;i<n;++i)
{
int val = pre[i];
if(val>a&&val<b || val<a&&val>b)
{
printf("LCA of %d and %d is %d.\n",a,b,val);
break;
}
else if(val==a|| val==b)
{
printf("%d is an ancestor of %d.\n",val==a?a:b,val==a?b:a);
break;
}
}
else printf("ERROR: %d is not found.\n",!aexits?a:b);
}
return ;
}

1144题:简单题,注意全部小于0是,应该输出1

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std; int main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
int n;
scanf("%d",&n);
int a[n];
for(int i=;i<n;++i)
scanf("%d",&a[i]);
sort(a,a+n);
for(int i=,j=;j<n;++i)
for(;j<n;++j)
{
if(a[j]==i) break;
else if(a[j]>i)
{
printf("%d\n",i);
return ;
}
}
printf("%d\n",max(a[n-]+,));
//printf("%d\n",a[n-1]);
return ;
}

1145题:hash的二次探测,题目比较坑 ,算查找的总次数,一般二次探测0到size-1次没找到就好了,但是它而要多加一,所以循环要写到0到size;

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std;
bool isPrime(int n)
{
for(int i=;i*i<=n;++i)
if(n%i==) return false;
return true;
}
int getsize(int n)
{
while(!isPrime(n)) ++n;
return n;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
int msize,n,m;
scanf("%d%d%d",&msize,&n,&m);
msize = getsize(msize);
int Hash[msize];
memset(Hash,,sizeof(Hash));
for(int i=;i<n;++i)
{
int a;
scanf("%d",&a);
int j;
for(j=;j<msize;++j)
if(Hash[(a+j*j)%msize]==)
{
Hash[(a+j*j)%msize] = a;
break;
}
if(j>=msize) printf("%d cannot be inserted.\n",a);
}
int t = m,cnt=;
while(t--)
{
int a;
scanf("%d",&a);
for(int i=;i<=msize;++i)
{
if(++cnt&&(Hash[(a+i*i)%msize]==a||(Hash[(a+i*i)%msize]==)))
break;
}
}
printf("%.1lf\n",1.0*cnt/m);
return ;
}

1146题:拓扑排序,了解拓扑排序的原理就行了。学习拓扑排序必须知道什么是入度,有向图中有边:顶点a到顶点b,则b的入度是1。所以拓扑排序是每次输出入度为0的顶点,并且把该顶点相连的边的另一个顶点的入度减一。

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std;
#define N (1100)
int Map[N][N];
int indegree[N];
int n,m;
bool isTopuSort(int* a)
{
int temp_indegree[N];
memcpy(temp_indegree,indegree,sizeof(temp_indegree));
for(int i=;i<n;++i)
{
if(temp_indegree[a[i]]!=) return false;
for(int j=;j<=n;++j) if(Map[a[i]][j]) --temp_indegree[j];
}
return true;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE scanf("%d%d",&n,&m);
for(int i=;i<m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
++indegree[b];
Map[a][b] = ;
}
int T;
scanf("%d",&T);
bool bFirst = true;
for(int t=;t<T;++t)
{
int a[n];
for(int i=;i<n;++i)
{
scanf("%d",&a[i]);
}
if(isTopuSort(a)==false)
{
if(bFirst) bFirst= false;
else printf(" ");
printf("%d",t);
}
}
printf("\n");
return ;
}

1147题:简单题,可以用不构造树的方式做。(当然构树也行,只是会麻烦一点~) heap tree。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
#define LEFT(i) (2*i+1)
#define RIGHT(i) (2*i+2)
bool isMaxHeap(int* a,int curI,int n)
{
if(curI>=n) return true;
int il = LEFT(curI),ir = RIGHT(curI);
if(il<n&&a[curI]<a[il]) return false;
if(ir<n&&a[curI]<a[ir]) return false;
return isMaxHeap(a,il,n)&&isMaxHeap(a,ir,n);
}
bool isMinHeap(int* a,int curI,int n)
{
if(curI>=n) return true;
int il = LEFT(curI),ir = RIGHT(curI);
if(il<n&&a[curI]>a[il]) return false;
if(ir<n&&a[curI]>a[ir]) return false;
return isMinHeap(a,il,n)&&isMinHeap(a,ir,n);
}
bool bFirst;
void post_travel(int* a,int curI,int n)
{
if(curI>=n) return;
post_travel(a,LEFT(curI),n);
post_travel(a,RIGHT(curI),n);
if(bFirst) bFirst = false;
else printf(" ");
printf("%d",a[curI]);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
int t,n;
scanf("%d%d",&t,&n);
while(t--)
{
int a[n];
for(int i=;i<n;++i)
scanf("%d",&a[i]);
if(isMaxHeap(a,,n)) printf("Max Heap\n");
else if(isMinHeap(a,,n)) printf("Min Heap\n");
else printf("Not Heap\n");
bFirst = true;
post_travel(a,,n);
printf("\n");
}
return ;
}

1148题:题目不好理解,有两个狼人,所有人中只有一狼一人说谎,输出两个狼人。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
int main(){
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
int n;
scanf("%d",&n);
int a[n+];
for(int i=;i<=n;++i)
scanf("%d",&a[i]);
for(int i=;i<=n;++i){
for(int j=i+;j<=n;++j){
int bwolf[n+];
memset(bwolf,,sizeof(bwolf));
bwolf[i] = bwolf[j] = ; //i,j为狼
bool bOK = (a[i]>)==bwolf[abs(a[i])]&&(a[j]<)==bwolf[abs(a[j])]||
(a[i]<)==bwolf[abs(a[i])]&&(a[j]>)==bwolf[abs(a[j])];
for(int k=,lie=;k<=n&&bOK;++k){
if(i==k||j==k) continue;
if((a[k]>)==bwolf[abs(a[k])]){
++lie;
if(lie>) bOK = false;
}
}
if(bOK){
printf("%d %d\n",i,j);
return ;
}
}
}
printf("No Solution\n");
return ;
}

1149题:简单题,两个物品放一起会爆炸,给出一串东西,判断这些东西有没有危险。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
set<int> misi[];
int main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<n;++i)
{
int a,b;
scanf("%d%d",&a,&b);
misi[a].insert(b);
misi[b].insert(a);
}
while(m--)
{
int k;
scanf("%d",&k);
vector<int> vi;
bool bOK = true;
for(int i=;i<k;++i)
{
int a;
scanf("%d",&a);
if(bOK)
{
set<int>& sidag=misi[a];
for(int j=;j<vi.size();++j)
{
if(sidag.find(vi[j])!=sidag.end())
{
bOK = false;
break;
}
}
vi.push_back(a);
}
}
printf("%s\n",bOK?"Yes":"No");
}
return ;
}

1150题:简单题

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std; int main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
int n,m;
scanf("%d%d",&n,&m);
int Map[n+][n+];
memset(Map,,sizeof(Map));
for(int i=;i<m;++i)
{
int a,b,l;
scanf("%d%d%d",&a,&b,&l);
Map[a][b] = Map[b][a] = l;
}
int T;
int minLen = <<;
int minPath = -;
scanf("%d",&T);
for(int t=;t<=T;++t)
{
printf("Path %d: ",t);
int cn;
scanf("%d",&cn);
int istart,iend;
bool bVis[n+];
memset(bVis,,sizeof(bVis));
bool bSimple = true;
int cnt = ,pre,len=;
int bNA = false;
for(int i=;i<cn;++i)
{
int a;
scanf("%d",&a);
if(i&&Map[pre][a]==) bNA = true;
else if(i) len += Map[pre][a];
if(i==) istart = a;
if(i==cn-) iend = a;
pre = a;
if(bVis[a]==)
{
bVis[a] = ;
++cnt;
}
else if(i!=cn-) bSimple = false;
}
if(bNA) printf("NA ");
else printf("%d ",len);
if(cnt!=n||bNA||istart!=iend) printf("(Not a TS cycle)\n");
else
{
if(minLen > len)
{
minLen = len;
minPath = t;
}
printf("(%s)\n",bSimple?"TS simple cycle":"TS cycle");
}
}
printf("Shortest Dist(%d) = %d\n",minPath,minLen);
return ;
}

1151题:用两个map,一个是把val转换成编号(从1开始,0表示没有),一个是把编号转换成val。中序输入的时候通过把val转换成编号,中序就是从小到大排序的,所以该树就变成搜索二叉树了。然后通过pre数组记录先序的编号,通过先前记录的map吧val转换成编号。所以该数时关于编号的搜索二叉树。然后接下来的做法就跟1143题一模一样了。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std; int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
int m,n;
scanf("%d%d",&m,&n);
map<int,int> valtoid;
map<int,int> idtoval;
int pre[n];
for(int i=;i<n;++i)
{
int a;
scanf("%d",&a);
valtoid[a] = i+;
idtoval[i+] = a;
}
for(int i=;i<n;++i)
{
int a;
scanf("%d",&a);
pre[i] = valtoid[a];
}
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
int aexits=valtoid[a],bexits=valtoid[b];
if(!aexits&&!bexits) printf("ERROR: %d and %d are not found.\n",a,b);
else if(!aexits||!bexits) printf("ERROR: %d is not found.\n",!aexits?a:b);
else
{
for(int i=;i<n;++i)
{
int ia = valtoid[a],ib = valtoid[b];
if(pre[i]<ia&&pre[i]>ib||pre[i]<ib&&pre[i]>ia)
{
printf("LCA of %d and %d is %d.\n",a,b,idtoval[pre[i]]);
break;
}
else if(pre[i]==ia||pre[i]==ib)
{
printf("%d is an ancestor of %d.\n",pre[i]==ia?a:b,pre[i]==ia?b:a);
break;
}
}
}
}
return ;
}

1152题:简单题,题目的tip也很详细。

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std;
#define L (1010)
bool isPrime(long long int a)
{
if(a==) return false;
for(long long int i=;i*i<=a&&i*i>;++i) if(a%i==) return false;
return true;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
int l,k;
scanf("%d%d",&l,&k);
char str[L];
scanf("%s",&str);
string res="";
for(int i=;i<l;++i)
{
res += str[i];
if(i+>=k)
{
if(res.length()>k) res = res.substr(,k);
long long int a = atoll(res.c_str());
if(isPrime(a))
{
printf("%s\n",res.c_str());
return ;
}
}
}
printf("404\n");
return ;
}

1153题:简单题,不要每次搜索1类型的时候都去排序,不然会超时。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
struct PAT
{
string str;
int sorce;
string type; //考试类型
string sitnum;
string date;
string testeenum;
void init(string str,int sorce)
{
this->str = str;
this->sorce =sorce;
int i = ;
sitnum = date = testeenum = "";
type = str[i++];
for(;i<;++i) sitnum += str[i];
for(;i<;++i) date += str[i];
for(;i<;++i) testeenum+=str[i];
}
};
int sitnum[];
PAT pats[];
int sitcmp(const int& a,const int& b)
{
if(sitnum[a]!=sitnum[b]) return sitnum[a]>sitnum[b];
return a<b;
}
int cmp(const int& a,const int& b)
{
PAT p1 = pats[a],p2=pats[b];
if(p1.sorce!=p2.sorce) return p1.sorce>p2.sorce;
return strcmp(p1.str.c_str(),p2.str.c_str())<;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
int n,m;
scanf("%d%d",&n,&m);
map<string,vector<int> > searchmap[];
for(int i=;i<n;++i)
{
char str[];
int sorce;
scanf("%s%d",str,&sorce);
pats[i].init(str,sorce);
searchmap[][pats[i].type].push_back(i);
searchmap[][pats[i].sitnum].push_back(i);
searchmap[][pats[i].date].push_back(i); }
set<string> bsort; //关于1对应key的序列是否排序好了
for(int i=;i<m;++i)
{
int opt;
char str[];
scanf("%d%s",&opt,str);
printf("Case %d: %d %s\n",i+,opt,str);
vector<int> &vi = searchmap[opt-][str];
memset(sitnum,,sizeof(sitnum));
if(vi.size())
{
if(opt==&&bsort.find(str)==bsort.end()) sort(vi.begin(),vi.end(),cmp),bsort.insert(str);
int tsorce = ;
for(int j=;j<vi.size();++j)
{
int index = vi[j];
if(opt==) printf("%s %d\n",pats[index].str.c_str(),pats[index].sorce);
else if(opt==) tsorce += pats[index].sorce;
else if(opt==) ++sitnum[atoi(pats[index].sitnum.c_str())];
}
if(opt ==) printf("%d %d\n",vi.size(),tsorce);
else if(opt==)
{
vector<int> sitvc;
for(int j=;j<;++j)
if(sitnum[j]) sitvc.push_back(j);
sort(sitvc.begin(),sitvc.end(),sitcmp);
for(int j=;j<sitvc.size();++j)
printf("%03d %d\n",sitvc[j],sitnum[sitvc[j]]);
}
}
else printf("NA\n");
}
return ;
}

1154题:简单题

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std; int main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif
int n,m;
scanf("%d%d",&n,&m);
vector<int> Map[n];
for(int i=;i<m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
Map[a].push_back(b);
}
int t;
scanf("%d",&t);
while(t--)
{
set<int> si;
int color[n];
for(int i=;i<n;++i)
{
scanf("%d",&color[i]);
si.insert(color[i]);
}
bool bOK = true;
for(int i=;i<n&&bOK;++i)
for(int j=;j<Map[i].size();++j)
if(color[i]==color[Map[i][j]])
{
bOK = false;
break;
}
if(bOK) printf("%d-coloring\n",si.size());
else printf("No\n");
}
return ;
}

1155题:简单题,跟1147一样是heap tree。估计题目有点想出堆排序,但是又怕没人会堆排序所以搞成这样吧。。

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std;
#define LEFT(i) (2*i+1)
#define RIGHT(i) (2*i+2)
struct Node
{
int val;
Node* left;
Node* right;
Node(){left=right=NULL;}
};
Node* Build(int *a,int i,int n)
{
if(i >= n) return NULL;
Node* node = new Node();
node->val = a[i];
node->left = Build(a,LEFT(i),n);
node->right = Build(a,RIGHT(i),n);
return node;
}
void travel(Node* node,vector<Node*> vn)
{
vn.push_back(node);
if(!node->left&&!node->right)
{
for(int i=;i<vn.size();++i)
{
if(i) printf(" ");
printf("%d",vn[i]->val);
}
printf("\n");
}
if(node->right) travel(node->right,vn);
if(node->left) travel(node->left,vn);
}
bool bMaxHeap(int* a,int i,int n)
{
if(i>=n) return true;
if(LEFT(i)<n&&a[i]<a[LEFT(i)]) return false;
if(RIGHT(i)<n&&a[i]<a[RIGHT(i)]) return false;
return bMaxHeap(a,LEFT(i),n)&&bMaxHeap(a,RIGHT(i),n);
}
bool bMinHeap(int* a,int i,int n)
{
if(i>=n) return true;
if(LEFT(i)<n&&a[i]>a[LEFT(i)]) return false;
if(RIGHT(i)<n&&a[i]>a[RIGHT(i)]) return false;
return bMinHeap(a,LEFT(i),n)&&bMinHeap(a,RIGHT(i),n);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif
int n;
scanf("%d",&n);
int a[n];
for(int i=;i<n;++i)
scanf("%d",&a[i]);
Node* root = Build(a,,n);
vector<Node*> vn;
travel(root,vn);
if(bMaxHeap(a,,n)) printf("Max Heap\n");
else if(bMinHeap(a,,n)) printf("Min Heap\n");
else printf("Not Heap\n");
return ;
}

PAT甲级考前整理(2019年3月备考)之三,持续更新中.....的更多相关文章

  1. PAT甲级考前整理(2019年3月备考)之二,持续更新中.....

    PAT甲级考前整理之一网址:https://www.cnblogs.com/jlyg/p/7525244.html,主要总结了前面131题的类型以及易错题及坑点. PAT甲级考前整理三网址:https ...

  2. PAT甲级考前整理(2019年3月备考)之一

       转载请注明出处:https://www.cnblogs.com/jlyg/p/7525244.html 终于在考前,刷完PAT甲级131道题目,不容易!!!每天沉迷在刷题之中而不能超脱,也是一种 ...

  3. IDEA 2019.2破解激活教程(激活到2089年8月,亲测有效,持续更新中...)

    本来笔者这边是有个正版激活码可以使用的,但是,2019.9月3号的时候,一些小伙伴反映这个注册码已经失效了,于是拿着自己的 IDEA, 赶快测试了一下,果不其然,已然是不能用了. 好在,笔者又找到了新 ...

  4. IntelliJ IDEA 2019.2.1 破解教程, 最新激活码(激活到2089年8月,亲测有效,持续更新中...)

    当前最新版本 IDEA 2019.2.1 本来笔者这边是有个正版激活码可以使用的,但是,2019.9月3号的时候,一些小伙伴反映这个注册码已经失效了,于是拿着自己的 IDEA, 赶快测试了一下,果不其 ...

  5. 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...

  6. 一些JavaSE学习过程中的思路整理(主观性强,持续更新中...)

    目录 一些JavaSE学习过程中的思路整理(主观性强,持续更新中...) Java书写规范 IDEA的一些常用快捷键 Java类中作为成员变量的类 Java源文件中只能有一个public类 Java中 ...

  7. 常见 git 需求整理(持续更新中)

    首发于 语雀文档 突然感觉自己对 git 还是挺熟悉的,因为团队里新来的七八号应届生来问我 git 问题,基本没有答不上的情况,但为了能更好地对知识进行整理,还是记录一下为好. (希望能)持续更新.. ...

  8. 2019年5月训练记录(更新ing)

    前言 \(ZJOI\)正式结束了. 但期中考试只考了年级\(216\),退役既视感... 于是就被抓回去补文化课了. 下半个学期可能要以文化课为主了吧! 但周三.周日应该还是会正常参加训练的,但其他时 ...

  9. 【PAT甲级】1119 Pre- and Post-order Traversals(前序后序转中序)

    [题目链接] [题意] 根据二叉树的前序和后序序列,如果中序序列唯一,输出Yes,如果不唯一输出No,并输出这个中序序列. [题解] 众所周知,二叉树是不能够根据前序和中序建立的,为什么呢?首先需要明 ...

随机推荐

  1. Windows Server 2012 R2 安装.NET Framework 3.5报错

    简单记录一下,Windows Server 2012 R2 安装.NET Framework 3.5报错,下面是解决方法 载入ISO文件Windows Server 2012 R2,而且在安装的过程中 ...

  2. iOS开发——高级篇——多线程dispatch_apply

    我们知道遍历数组是一个相对耗时的操作,而同时手机的核是越来越多,所以我们需要充分利用iOS多核的作用. 特别是在遍历操作中还有其他耗时操作.像我们平时直接遍历数组的操作 ,i< ,i++){ / ...

  3. command 'gcc' failed with exit status 1

    https://stackoverflow.com/questions/11094718/error-command-gcc-failed-with-exit-status-1-while-insta ...

  4. solr入门之多线程操作solr中索引字段的解决

    涉及的问题: 建索引时有一个字段是该词语出现的次数,这个字段是放在solr里的  而我用的是多线程来进行全量导入的,这里就涉及到了多线程问题 多个线程操作同一个变量时怎样处理? 我是这样子做的 : 首 ...

  5. java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例

    package org.rui.io.xml; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import ...

  6. Delphi XE10调用WebService服务获取图片验证码

    最近做了一个程序,需要使用图片验证码,百度一下,网上一大把免费的WebService服务,随意找一个用用,效果还可以.WebService地址:http://www.webxml.com.cn/Web ...

  7. linux文件读写 文件锁、select、poll【转】

    本文转载自:http://blog.csdn.net/fansongy/article/details/6853395 一.文件锁 文件锁用于多个用户共同使用或操作同一个文件.有读锁的时候可以再加读锁 ...

  8. PHPExcel使用收藏

    注意:PHP7版本中phpexcel导出文件是提示找不到文件,需修改PHPExcel目录下的calculation目录下的Functions.php的581行  去掉break; 下面是总结的几个使用 ...

  9. KMP算法在字符串中的应用

    KMP算法是处理字符串匹配的一种高效算法 它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配.从渐进的意义上说,这样时间复杂度已经是最好的了,需要O(m+n)时间.对KMP的学习可以 ...

  10. JAVA JVM 流程一

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机 ...