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[20];
scanf("%s",str);
char str1[20],str2[20];
int len = strlen(str);
strncpy(str1,str,len/2);
str1[len/2]='\0';
strcpy(str2,str+len/2);
int a = atoi(str1),b=atoi(str2);
int c = atoi(str);
//a*b超出int32
if(a*b<=0||c%(a*b)) printf("No\n");
else printf("Yes\n");
}
return 0;
}
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=0;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!=-1;addr=sts[addr].next)
vs.push_back(sts[addr]);
vector<ST> vs0/*负数*/,vs1/*比k小或等于的正数*/,vs2/*比k大的正数*/;
for(int i=0;i<vs.size();++i)
{
if(vs[i].val < 0) 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=0;i<vs1.size();++i) vs.push_back(vs1[i]);
for(int i=0;i<vs2.size();++i) vs.push_back(vs2[i]);
for(int i=0;i<vs.size();++i)
{
if(i!=vs.size()-1)
printf("%05d %d %05d\n",vs[i].addr,vs[i].val,vs[i+1].addr);
else
printf("%05d %d -1\n",vs[i].addr,vs[i].val);
}
}
return 0;
}
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=0;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,0,sizeof(V)); //下标表示定点,值表示是否有无改点
for(int i=0;i<nv;++i)
{
int a;
scanf("%d",&a);
V[a] = true;
}
for(int i=0;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 0;
}
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 = 0;
string res = "";
for(int i=len-1;i>=0;--i)
{
int k = str1[i]-'0'+str2[i]-'0' + add;
add = k/10;
res += (k%10+'0');
}
if(add) res += (add+'0');
reverse(res.begin(),res.end());
return res;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
char temp[1010];
scanf("%s",temp);
string str = temp,str2=temp;
for(int i=0;i<10;++i)
{
reverse(str2.begin(),str2.end());
if(strcmp(str.c_str(),str2.c_str())==0)
{
printf("%s is a palindromic number.\n",str.c_str());
return 0;
}
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 0;
}
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=-1;}
void UpdateG()
{
if(Gm > Gf) G = int(Gm*0.4f+Gf*0.6f+0.5f);
else G = Gf;
}
bool IsUseful()
{
if(Gp<200) return false;
if(G<60) 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())<0;
}
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=0;i<p;++i)
{
char strid[30];
int g;
scanf("%s%d",strid,&g);
mss[strid].Gp = g;
mss[strid].id = strid;
}
for(int i=0;i<m;++i)
{
char strid[30];
int g;
scanf("%s%d",strid,&g);
mss[strid].Gm = g;
mss[strid].id = strid;
}
for(int i=0;i<n;++i)
{
char strid[30];
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=0;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 0;
}
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==1) return *pre;
int val = *pre;
int iIndex;
for(iIndex=0;iIndex<n;++iIndex)
{
if(val == inorder[iIndex])
{
break;
}
}
if(iIndex>0)
{
return FindFirst(pre+1,inorder,iIndex);
}
else
{
return FindFirst(pre+iIndex+1,inorder+iIndex+1,n-iIndex-1);
}
}
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=0;i<n;++i)
scanf("%d",&pre[i]);
for(int i=0;i<n;++i)
scanf("%d",&inorder[i]);
printf("%d\n",FindFirst(pre,inorder,n));
return 0;
}
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[0] != v2[0]) return v1[0] < v2[0];
return v1[1] < v2[1];
}
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,0,sizeof(bVis));
bVis[thepeo1] = true;
for(int i=0;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=0;j<pvs->size();++j)
{
int id2 = (*pvs)[j];
//printf(" 2:%04d\n",id2);
if(!bVis[id2]&&id2!=thepeo2)
{
bVis[id2] = true;
for(int k=0;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=0;i<m;++i)
{
char str1[20],str2[20];
scanf("%s%s",str1,str2);
int id1 = abs(atoi(str1)),id2=abs(atoi(str2));
if(str1[0]=='-'&&str2[0]=='-'
||str1[0]!='-'&&str2[0]!='-')
{
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[20],str2[20];
scanf("%s%s",str1,str2);
if(str1[0]=='-'&&str2[0]=='-'||str1[0]!='-'&&str2[0]!='-')
{
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=0;i<res.size();++i)
{
vector<int>& vi = res[i];
for(int j=0;j<vi.size();++j)
{
if(j) printf(" ");
printf("%04d",vi[j]);
}
printf("\n");
}
}
return 0;
}
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[0],cnt=0;
for(int i=0;i<len;++i)
{
if(c==str[i]) ++cnt;
else if(c!=str[i])
{
res += c;
char strcnt[1000];
sprintf(strcnt,"%d",cnt);
res +=strcnt;
c = str[i];
cnt = 1;
}
if(i==len-1)
{
res += c;
char strcnt[1000];
sprintf(strcnt,"%d",cnt);
res +=strcnt;
}
}
return res;
}
//题意:后面的数字是对前面数字的描述
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
char a[100];
int n;
scanf("%s%d",&a,&n);
string str = a;
for(int i=1;i<n;++i)
str=getstr(str);
printf("%s\n",str.c_str());
return 0;
}
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=0;i<ne;++i)
{
int a,b;
scanf("%d%d",&a,&b);
Map[a][b] = Map[b][a] = 1;
}
int t;
scanf("%d",&t);
while(t--)
{
int k;
scanf("%d",&k);
int a[k];
for(int i=0;i<k;++i)
scanf("%d",&a[i]);
bool bClique = true;
for(int i=0;i<k;++i)
for(int j=0;j<k;++j)
{
//要求每条边两两相交
if(i!=j&&Map[a[i]][a[j]]==0)
{
bClique = false;
break;
}
}
if(bClique)
{
bool bMax = true;
for(int i=1;i<=nv;++i)
{
int j;
for(j=0;j<k;++j)
{
if(Map[i][a[j]]==0)
break;
}
if(j==k)
{
bMax = false;
break;
}
}
if(bMax) printf("Yes\n");
else printf("Not Maximal\n");
}
else printf("Not a Clique\n");
}
return 0;
}
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=0;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=0;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 0;
}
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=0;i<n;++i)
scanf("%d",&a[i]);
sort(a,a+n);
for(int i=1,j=0;j<n;++i)
for(;j<n;++j)
{
if(a[j]==i) break;
else if(a[j]>i)
{
printf("%d\n",i);
return 0;
}
}
printf("%d\n",max(a[n-1]+1,1));
//printf("%d\n",a[n-1]);
return 0;
}
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=2;i*i<=n;++i)
if(n%i==0) 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,0,sizeof(Hash));
for(int i=0;i<n;++i)
{
int a;
scanf("%d",&a);
int j;
for(j=0;j<msize;++j)
if(Hash[(a+j*j)%msize]==0)
{
Hash[(a+j*j)%msize] = a;
break;
}
if(j>=msize) printf("%d cannot be inserted.\n",a);
}
int t = m,cnt=0;
while(t--)
{
int a;
scanf("%d",&a);
for(int i=0;i<=msize;++i)
{
if(++cnt&&(Hash[(a+i*i)%msize]==a||(Hash[(a+i*i)%msize]==0)))
break;
}
}
printf("%.1lf\n",1.0*cnt/m);
return 0;
}
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=0;i<n;++i)
{
if(temp_indegree[a[i]]!=0) return false;
for(int j=1;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=0;i<m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
++indegree[b];
Map[a][b] = 1;
}
int T;
scanf("%d",&T);
bool bFirst = true;
for(int t=0;t<T;++t)
{
int a[n];
for(int i=0;i<n;++i)
{
scanf("%d",&a[i]);
}
if(isTopuSort(a)==false)
{
if(bFirst) bFirst= false;
else printf(" ");
printf("%d",t);
}
}
printf("\n");
return 0;
}
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=0;i<n;++i)
scanf("%d",&a[i]);
if(isMaxHeap(a,0,n)) printf("Max Heap\n");
else if(isMinHeap(a,0,n)) printf("Min Heap\n");
else printf("Not Heap\n");
bFirst = true;
post_travel(a,0,n);
printf("\n");
}
return 0;
}
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+1];
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
for(int i=1;i<=n;++i){
for(int j=i+1;j<=n;++j){
int bwolf[n+1];
memset(bwolf,0,sizeof(bwolf));
bwolf[i] = bwolf[j] = 1; //i,j为狼
bool bOK = (a[i]>0)==bwolf[abs(a[i])]&&(a[j]<0)==bwolf[abs(a[j])]||
(a[i]<0)==bwolf[abs(a[i])]&&(a[j]>0)==bwolf[abs(a[j])];
for(int k=1,lie=0;k<=n&&bOK;++k){
if(i==k||j==k) continue;
if((a[k]>0)==bwolf[abs(a[k])]){
++lie;
if(lie>1) bOK = false;
}
}
if(bOK){
printf("%d %d\n",i,j);
return 0;
}
}
}
printf("No Solution\n");
return 0;
}
1149题:简单题,两个物品放一起会爆炸,给出一串东西,判断这些东西有没有危险。


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
set<int> misi[100010];
int main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif // ONLINE_JUDGE
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;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=0;i<k;++i)
{
int a;
scanf("%d",&a);
if(bOK)
{
set<int>& sidag=misi[a];
for(int j=0;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 0;
}
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+1][n+1];
memset(Map,0,sizeof(Map));
for(int i=0;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 = 1<<30;
int minPath = -1;
scanf("%d",&T);
for(int t=1;t<=T;++t)
{
printf("Path %d: ",t);
int cn;
scanf("%d",&cn);
int istart,iend;
bool bVis[n+1];
memset(bVis,0,sizeof(bVis));
bool bSimple = true;
int cnt = 0,pre,len=0;
int bNA = false;
for(int i=0;i<cn;++i)
{
int a;
scanf("%d",&a);
if(i&&Map[pre][a]==0) bNA = true;
else if(i) len += Map[pre][a];
if(i==0) istart = a;
if(i==cn-1) iend = a;
pre = a;
if(bVis[a]==0)
{
bVis[a] = 1;
++cnt;
}
else if(i!=cn-1) 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 0;
}
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=0;i<n;++i)
{
int a;
scanf("%d",&a);
valtoid[a] = i+1;
idtoval[i+1] = a;
}
for(int i=0;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=0;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 0;
}
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==0) return false;
for(long long int i=2;i*i<=a&&i*i>0;++i) if(a%i==0) 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=0;i<l;++i)
{
res += str[i];
if(i+1>=k)
{
if(res.length()>k) res = res.substr(1,k);
long long int a = atoll(res.c_str());
if(isPrime(a))
{
printf("%s\n",res.c_str());
return 0;
}
}
}
printf("404\n");
return 0;
}
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 = 0;
sitnum = date = testeenum = "";
type = str[i++];
for(;i<4;++i) sitnum += str[i];
for(;i<10;++i) date += str[i];
for(;i<13;++i) testeenum+=str[i];
}
};
int sitnum[1000];
PAT pats[10010];
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())<0;
}
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[3];
for(int i=0;i<n;++i)
{
char str[30];
int sorce;
scanf("%s%d",str,&sorce);
pats[i].init(str,sorce);
searchmap[0][pats[i].type].push_back(i);
searchmap[1][pats[i].sitnum].push_back(i);
searchmap[2][pats[i].date].push_back(i);
}
set<string> bsort; //关于1对应key的序列是否排序好了
for(int i=0;i<m;++i)
{
int opt;
char str[30];
scanf("%d%s",&opt,str);
printf("Case %d: %d %s\n",i+1,opt,str);
vector<int> &vi = searchmap[opt-1][str];
memset(sitnum,0,sizeof(sitnum));
if(vi.size())
{
if(opt==1&&bsort.find(str)==bsort.end()) sort(vi.begin(),vi.end(),cmp),bsort.insert(str);
int tsorce = 0;
for(int j=0;j<vi.size();++j)
{
int index = vi[j];
if(opt==1) printf("%s %d\n",pats[index].str.c_str(),pats[index].sorce);
else if(opt==2) tsorce += pats[index].sorce;
else if(opt==3) ++sitnum[atoi(pats[index].sitnum.c_str())];
}
if(opt ==2) printf("%d %d\n",vi.size(),tsorce);
else if(opt==3)
{
vector<int> sitvc;
for(int j=0;j<1000;++j)
if(sitnum[j]) sitvc.push_back(j);
sort(sitvc.begin(),sitvc.end(),sitcmp);
for(int j=0;j<sitvc.size();++j)
printf("%03d %d\n",sitvc[j],sitnum[sitvc[j]]);
}
}
else printf("NA\n");
}
return 0;
}
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=0;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=0;i<n;++i)
{
scanf("%d",&color[i]);
si.insert(color[i]);
}
bool bOK = true;
for(int i=0;i<n&&bOK;++i)
for(int j=0;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 0;
}
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=0;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=0;i<n;++i)
scanf("%d",&a[i]);
Node* root = Build(a,0,n);
vector<Node*> vn;
travel(root,vn);
if(bMaxHeap(a,0,n)) printf("Max Heap\n");
else if(bMinHeap(a,0,n)) printf("Min Heap\n");
else printf("Not Heap\n");
return 0;
}
来源:oschina
链接:https://my.oschina.net/u/4405433/blog/3653207