【备战蓝桥杯】USACo-- airpro【改变策略】
編碼到現在,我明白了一點。我之所以如此安排自己coding, 說實話就是為了嘗試恢復到自己去年上半年時的狀態。
但是我發現了,越是想恢復原來那個所謂的巔峰狀態,就越發現還差了點東西沒有,要么是思想,要么是處理問題的思路,或者平時的行為習慣。
于是我就越想彌補,越發現自己不如以前。
其實不然,我現在與以前的狀態已經完全不同,我周圍的環境,身邊的人也已經完全不同,不能再完全按照原來的路子來。
總之,就是得更新策略。得向前看,縱向比較,我是進步了的。整體都在進步,綜合都在進步。
某一方面特別強勢,而其他方面的缺失,是不能說明強大的。正如木桶理論的最短板理論。
因此,我只需向前奔跑,不管我以前什么狀態,什么思想,什么行為習慣。just do it!
我只管提升現在的知識基礎、感情基礎、環境基礎的我的能力就好,并通過熟練,加以融合。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面是我的另外一道題,只完成到一半。目前覺得沒有很大必要寫下去,留待以后吧。
學會的新的思路:
1、將雙平方數,另外coding打表出來;
2、放到測試的程序中作為初始的data使用;
3、接下來就是邏輯安排與分析了。
下面的是auxiliary.c ?文件
#include <stdio.h> #include <stdlib.h> #define INFINITE 1000void gene(int *in) {int p,q; // FILE *out; // out = fopen("square.txt","w");int i=0;for(p=0 ; p <= 250 ;p++){for(q=0 ; q <= 250 ; q++){//printf("%d,",p*p+q*q);in[i++] = p*p+q*q;}}printf("%d",i); }void quick(int *in,int l ,int r) {if( l < r ){int i= l ,j =r, x= in[l];while(i < j)//內部判斷的都是i和j {while( i < j && in[j] >= x )j--;if(i < j )in[i++] = in[j];while(i < j && in[i] < x)//注意這個等號可以不要 i++;if(i < j)in[j--] = in[i];}in[i] = x;quick(in,l ,i-1);//注意這里的分界點是i,不是r,下面也是 quick(in, i+1 ,r);} }/* void quick(int *node,int l,int r) { if (l < r) { //Swap(s[l], s[(l + r) / 2]); //將中間的這個數和第一個數交換 參見注1 int i = l, j = r,x = node[l];while (i < j) { while(i < j && node[j] >= x) // 從右向左找第一個小于x的數 j--; if(i < j) node[i++] = node[j]; while(i < j && node[i] < x) // 從左向右找第一個大于等于x的數 i++; if(i < j) node[j--] = node[i]; } node[i] = x; quick(node, l, i - 1); // 遞歸調用 quick(node, i + 1, r); } } */void merge(int *a,int start,int mid,int end) { int i,j,k; //申請輔助數組 int *array1=(int *)malloc(sizeof(int)*(mid-start+2)); int *array2=(int *)malloc(sizeof(int)*(end-mid+1)); //把a從mid分開分別賦值給數組 for(i=0;i<mid-start+1;i++) *(array1+i)=a[start+i]; *(array1+i)=INFINITE;//作為哨兵 for(i=0;i<end-mid;i++) *(array2+i)=a[i+mid+1]; *(array2+i)=INFINITE; //有序的歸并到數組a中 i=j=0; for(k=start;k<=end;k++){ if(*(array1+i) > *(array2+j)){ a[k]=*(array2+j); j++; } else{ a[k]=*(array1+i); i++; } } free(array1); free(array2); } //歸并排序 void mergeSort(int *a,int start,int end) { int mid=(start+end)/2; if(start<end){ //分解 mergeSort(a,start,mid); mergeSort(a,mid+1,end); //合并 merge(a,start,mid,end); } } int clear(int *in,int *out) {int i,j=0;for(i=0 ; i < 251*251-1; i++){if(in[i+1] !=in[i]){out[j++] = in[i];}}out[j++] = in[i];return j; } void print(int *out,int len) {FILE *fout;fout = fopen("squ.txt","w");int i;for(i=0 ; i< len ; i++){fprintf(fout,"%d,",out[i]);}fclose(fout); }int main() {int square[251*251];int out[251*251];int len;gene(square);printf("gene is all done!");//mergeSort(square,0,251*251-1); quick(square,0,251*251-1);printf("quick is all done!");len = clear(square,out);printf("clear is all done!");print(out,len);printf("this is all done!\n--%d",251*251-1);return 0; }下面是部分測試coding。arc.c /* 1 5 9 13 17 【我的思路】 1、預先用程序打出一張雙平方數表, 最大250平方 + 250平方 2、利用折半查找搜索題目要求的數據范圍。 (或者就一直取數判斷,當取到的數大于限制的時候就停止) 3、從數組的步長開始逐個嘗試,是否符合方差長度的組合。 1 2 4 5 8 4、排序結果,輸出。 */ #include <stdio.h> int squ[21047]={0,1,2,……};//太多了。省略。網頁已經無法保存 int mark(int max) {int i;for(i=0 ; i< 21047 ; i++){if( squ[i]==max*max*2)return i;}/*int max2 = max*max*2;int beg=0,end = 21046;int mid = (beg+end)/2;while( squ[mid]!= max2 ){if( max2 < squ[mid]){end = mid;}else{beg = mid;}}return mid;*/ }int main() {int len,max;scanf("%d",&len);scanf("%d",&max);//獲取最大值的數組下標 int poi = mark(max);int i,step=1;int count,dis,beg;//方差從1開始, 一個一個實驗,尋找 大于等于該方差的 下標//1、如果找到了本串, (待優化,繼續判斷的增加),則從本串開始的下一個下標開始;//2、沒找全,也繼續 同上//方差直到 小于 max*max//下標直到 小于poifor( dis=1 ; dis < max*max ; dis++){beg=0;count=1;for( i=1; beg+i < poi ; i++){for( ; squ[beg+i]-squ[beg+i-1]<dis && beg+i < poi; i++);if( squ[beg+i]-squ[beg+i-1]==dis){count++;}else{ count=1;beg++;i=0;}if( count==len){printf("%d %d\n",squ[beg],dis);count=1;beg++;i=0;}}} return 0; }
總結
以上是生活随笔為你收集整理的【备战蓝桥杯】USACo-- airpro【改变策略】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 16秋南开计算机应用答案,南开16秋学期
- 下一篇: android键盘还是讯飞输入,讯飞输入