最近准备考pat甲级,今天先找了去年的题目练了练。
总结:
(1)时间分配的不够合理,这次我用了15min读完了所有题,感觉不难就依次去做了,后来第二题卡了太久了,
就导致后面两题的时间不够了,最后两题没拿满分(后来补题时发现好简单QAQ),下次如果25分的题时间超过40min就应该
先看后面的。
(2)做题速度还是很慢,有时候思路都是有的,却要磨蹭好久,一定要改掉这个坏习惯。
pat-1152(hash)
思路:
用hash处理整个字符串,然后依次访问[i,i+k-1]区间的数字,判断是否为素数即可。
注意:
(1)hash数组是unsigned int类型的,不要写成 unsigned long long类型的,不然素数一判断就爆。
(2)从进行hash时要从[0,L-K]区间,考虑第一字母。
pat-1153(排序模拟)
题意:
三种要求输出
1、输出一个区块的所有排好序的卡号和成绩,卡号升序,成绩降序;
2、输出所有考场的考试人数,和这个考场内的考生成绩总和;
3、输出某一天的考场和考场内的考试人数,考场序号升序,人数降序。
思路:
排序,按照要求排序,还有stl的使用。
注意:
(1)这道题我WA了好久,开始我想直接全部排序完再直接输出,不然会超时,但是后来发现条件1,2容易满足,
条件3不容易,看列别人的文章,我发现可以现用现排(不管超不超时,先模拟出来再说)。
(2)三个条件都要考虑不存在的条件,一开始我第一就忘记考虑了。
(3)注意输出的格式,日期要是06d,6个单位。
#include
#include
#include
#include
#include
pat-1154(送分题)
思路:就是判断一下一条边的两个点颜色是否相同。
pat-1155(二叉树的遍历+堆)
思路:
二叉堆就是一个完全二叉树,可以用中序遍历判断是最大堆还是最小堆,
完全二叉树性质:最多2^x-1个节点,最少2^(x-1)-1个节点,所以求出最少的节点个数m,
所以m就是最右边的节点,然后依次从叶子节点比遍历就好了。
(感觉25和30分的题目出反了)。
#include
#include
#include
#include
using namespace std;
const int maxn = 100100;
int tree[maxn],f1,f2,vis[maxn];
vector vc[maxn];
void In1(int x)
{
if(tree[x]){
In1(x*2);
if(tree[x*2]&&tree[x*2]tree[x]) f2=0;
if(tree[x*2+1]&&tree[x*2+1]>tree[x]) f2=0;
if(tree[x*2]+tree[x*2+1]==0) vis[x]=1;
In2(x*2+1);
}
}
int main(void)
{
int n,i,j,m=1,N=2;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&tree[i]);
while(N<=n){
N*=2;m*=2;
}
f1=f2=1;
In1(1);In2(1);
for(i=1;i<=n;i++)
if(vis[i]==1){
for(j=i;j>0;j/=2) vc[i].push_back(tree[j]);
}
m--;
for(i=m;i>=1;i--)
if(vis[i]==1){
int tp=vc[i].size();
for(j=tp-1;j>=0;j--){
if(j!=tp-1) printf(" ");
printf("%d",vc[i][j]);
}
printf("\n");
}
for(i=n;i>=m+1;i--)
if(vis[i]==1){
int tp=vc[i].size();
for(j=tp-1;j>=0;j--){
if(j!=tp-1) printf(" ");
printf("%d",vc[i][j]);
}
printf("\n");
}
if(f1) printf("Min Heap\n");
else if(f2) printf("Max Heap\n");
else printf("Not Heap\n");
return 0;
}