PAT-B

1003:分析题目要求就会发现,是要求出P之前的A个数、PT中间的A个数、T之后的A个数,以及它们之间的关系,依次来判断Yes or No,因此解题前要多分析题目题意。C语言实现:https://www.cnblogs.com/EasonDongH/p/9571917.html

1015:主要是对Compare函数的各种情况考虑周全。

1020:用到贪心策略,即优先卖最贵的月饼,然后卖次贵的月饼,以此类推。C语言实现:https://www.cnblogs.com/EasonDongH/p/9571981.html

1025:翻转链表,链表操作的基本技能。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define MAXSIZE 100001
 5 #define Null -1
 6 
 7 typedef int ElementType;
 8 typedef struct LNode *PtrToNode;
 9 struct LNode{
10   ElementType Data;
11   int Address, Next;
12 };
13 typedef PtrToNode List;
14 
15 int ReverseK(List *list, int head, int k){
16   int cnt=0, p2, tmp1, tmp2;
17   
18   tmp1 = Null;
19   p2 = head;
20   tmp2 = list[p2]->Next;
21   while( cnt < k ){
22     cnt++;
23     list[p2]->Next = tmp1;
24     tmp1 = p2;
25     p2 = tmp2;
26     if( tmp2 != Null )
27       tmp2 = list[tmp2]->Next;
28   }
29   
30   list[head]->Next = p2;
31   return tmp1;
32 }
33 
34 int GetLength(List *list, int head){
35   int cnt=0;
36   
37   while( head != Null ){
38     cnt++;
39     head = list[head]->Next;
40   }
41   
42   return cnt;
43 }
44 
45 int ReverseEveryK(List *list, int head, int k){
46   if( k == 1 || head == -1 )
47     return head;
48     
49   int cnt=0, length, p1, p2, p3;
50   
51   length = GetLength( list, head);
52   
53   p1 = MAXSIZE-1;
54   list[p1] = (List)malloc(sizeof(struct LNode));
55   list[p1]->Next = head;
56   p2 = head;
57   while( length >= k ){
58     p3 = ReverseK( list, p2, k);
59     list[p1]->Next = p3;
60     p1 = p2;
61     p2 = list[p2]->Next;
62     
63     length -= k;
64   }
65   
66   return list[MAXSIZE-1]->Next;
67 }
68 
69 void Print(List *list, int head){
70   while( head != Null ){
71       if( list[head]->Next != Null )
72       printf("%05d %d %05d\n", list[head]->Address, list[head]->Data, list[head]->Next);
73     else
74       printf("%05d %d -1\n", list[head]->Address, list[head]->Data);
75     head = list[head]->Next;
76   }
77 }
78 
79 int main(void){
80   int i, address, next, head, N, K;
81   ElementType data;
82   List list[MAXSIZE];
83   
84   scanf("%d %d %d", &head, &N, &K);
85   for( i=0; i<N; i++){
86     scanf("%d %d %d", &address, &data, &next);
87     list[address] = malloc(sizeof(struct LNode));
88     list[address]->Address = address;
89     list[address]->Data = data;
90     list[address]->Next = next;
91   }
92   
93   head = ReverseEveryK( list, head, K);
94 //  head = ReverseK( list, head, 5);
95   Print( list, head);
96   
97   return 0;
98 }
C语言实现

1027:  测试点2未过:当N<=6时,仅需输出一个符号;我输出了3个。

1028:测试3未过:当有效数据为0时,记得输出0,且末尾不能有空格;我有空格。

1030:动态规划,递归Timeout;时间截止时还有测试点4未过,超时。C语言实现:https://www.cnblogs.com/EasonDongH/p/9530864.html

1031: 题意理解问题:对前17位数字加权求和,是指将该位的那个数与该位对应的权值相乘,将前17位的乘积求和,再对11求模得Z.

Z += (ID[i]-'0')*right[i];

1035: 判断插入与归并,并写出下一步排序结果;问题卡在归并排序中,每K个已有序,中的K值求解。得到K之后再随意调用一种算法将数列中每K*2个序列进行排序即可。

int GetLength(int sorted[], int N){
    int i, l, flag;
    
    for( l=2; l<=N; l*=2){
        flag = 1;
        for( i=l; i<N; i+=2*l){
            if( sorted[i] < sorted[i-1] ){
                flag = 0;
                break;
            }
        }
        if( !flag )
          break;
    }
    return l;
}
求K值
void merge_sort_once(int* A, int N, int sorted_num){
    int i=0, k, tmp, flag;
    
    k = 2*GetLength( A, N);
    
  while( i < N ){
    if( i + k < N )
         tmp = k;
    else
         tmp = N - i;
         
    sort( A+i, tmp);
    i += tmp;
    }
}
再进行一次归并

1040:测试4没过,求余运算相当于while(N>=mod)N-=mod,不能使用if;且为什么很多大数都要对1000000007 求余?解答。C语言实现:https://www.cnblogs.com/EasonDongH/p/9538960.html

1045:改进多层循环为迭代,避免超时。C语言实现:https://www.cnblogs.com/EasonDongH/p/9542116.html

1048: 数字加密,一直有两个测试项过不去;原因:当需要加密的整数位数不足加密key时,要在该需加密的数前补零,即最后结果位数一定是与加密key位数一致的,这是个坑,没想到!

1051: 复数乘法,很简单的题,但是再次挂在对精度0的判断上,第二次了(上一次),引以为戒!0.01这个值根据精度要求而来,题目要求是两位数。

if( R+0.01>=0 && R<0 )

 1067:测试项2一直不过,考试时间过了也没解决,之后测试发现:

scanf("%s %d\n", &passWord, &N);

一开始这样写来过滤结尾的换行符,因为从下一行开始要读取字符串;但测试项2就挂在这里,其他不变,这里改写为:

scanf("%s %d", &passWord, &N);
getchar();

就通过了,暂未想明白。

1068:这道题不难,但是却没能满分,注意点3个:一是虽然题目写的是八个相邻点,但四个边的点也要考虑;二差值要加上绝对值才能作比较;三不光要比较周围的点的差值,也要保证当前点的元素值在输入中的唯一性。且这里一直有个段错误,直到开个大数组才解决,未解。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 
 5 int All_Color[20000000]={0};
 6 
 7 int Find(int Color[][2], int color, int N){
 8   int i;
 9   
10   for( i=0; i<N; i++)
11     if( Color[i][0] == color )
12       return i;
13   return -1;
14 }
15 
16 int main(void){
17   int i, j, M, N, TOL, index=0, cnt=0, tmp=0, exit_X, exit_Y;
18     
19   scanf("%d %d %d", &M, &N, &TOL);
20   int A[N][M], Color[N*M][2];
21   for( i=0; i<N; i++)
22     for( j=0; j<M; j++){
23       scanf("%d", &A[i][j]);
24       All_Color[A[i][j]]++;
25       //为什么一直段错误?
26       // tmp = Find( Color, A[i][j], index);
27       // if( tmp == -1 ){
28       //   Color[index][0] = A[i][j];
29       //   Color[index][1] = 1;
30       //   index++;
31       // }
32       // else
33       //   Color[tmp][1]++;
34     }
35       
36   for( i=0; i<N; i++){
37     for( j=0; j<M; j++){
38       // tmp = Find( Color, A[i][j], index);
39       // if( tmp >= 0 && Color[tmp][1] > 1 )
40       //   continue;
41       if( All_Color[A[i][j]] > 1 )
42         continue;
43       if( i>0 && abs(A[i][j] - A[i-1][j]) <= TOL )//up
44         continue;
45       if( (i>0&&j<M-1) && abs(A[i][j] - A[i-1][j+1]) <= TOL )//up-right
46         continue;
47       if( j<M-1 && abs(A[i][j] - A[i][j+1]) <= TOL )//right
48         continue;
49       if( (i<N-1&&j<M-1) && abs(A[i][j] - A[i+1][j+1]) <= TOL )//down-right
50         continue; 
51       if( i<N-1 && abs(A[i][j] - A[i+1][j]) <= TOL )//down
52         continue; 
53       if( (i<N-1&&j>0) && abs(A[i][j] - A[i+1][j-1]) <= TOL )//down-left
54         continue;
55       if( j>0 && abs(A[i][j] - A[i][j-1]) <= TOL )//left
56         continue;
57       if( (i<N-1&&j>0) && abs(A[i][j] - A[i-1][j-1]) <= TOL )//up-left
58         continue;
59       
60       exit_X = j; exit_Y = i;
61       cnt++;
62       if( cnt > 1 )
63         break;
64     }
65     if( cnt > 1 )
66       break;
67   }  
68   if( cnt == 0 )
69     printf("Not Exist\n");
70   else{
71     if( cnt == 1 )
72       printf("(%d, %d): %d\n", exit_X+1, exit_Y+1, A[exit_Y][exit_X]);
73     else
74       printf("Not Unique\n");
75   }
76   
77   return 0;
78 }
C实现

1080: 逻辑判断,结合了排序、查找。刚开始最后一个测试项一直过不了,分析代码会发现在根据姓名查找学生的时候比较耗时,最坏O(n2),一般这种最后一题平方数量级都是不能接受的。改良是一开始用的hashing,结果还是超时,可能是我用的线性探测比较耗时吧;该用二分查找,就过了。C语言代码实现:https://www.cnblogs.com/EasonDongH/p/9578759.html

1085: 排序前先要保证分数的数据类型为int比较才能对。

posted @ 2018-08-24 16:59  EasonDongH  阅读(205)  评论(0编辑  收藏  举报