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