zoukankan      html  css  js  c++  java
  • 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
    ", list[head]->Address, list[head]->Data, list[head]->Next);
    73     else
    74       printf("%05d %d -1
    ", 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
    ", &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
    ");
    70   else{
    71     if( cnt == 1 )
    72       printf("(%d, %d): %d
    ", exit_X+1, exit_Y+1, A[exit_Y][exit_X]);
    73     else
    74       printf("Not Unique
    ");
    75   }
    76   
    77   return 0;
    78 }
    C实现

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

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

  • 相关阅读:
    iPhone电话与短信相关代码小结
    时间都去哪儿了?开源一个统计iPhone上App运行时间和打开次数的小工具【iOS8已失效】
    分享一个仿网易新闻客户端iPhone版的标签式导航ViewController
    iOS推送小结(证书的生成、客户端的开发、服务端的开发)
    Argy1risMatrix1
    2019河南模考题
    撮箕2020-3-8
    数学符号md
    2014全国甲&2015福建-几何题
    零点
  • 原文地址:https://www.cnblogs.com/EasonDongH/p/9530865.html
Copyright © 2011-2022 走看看