problema(hdu1215)
problemb(hdu1286)
這兩題是上課例題,不再贅述了。
problemc(hdu1406)
【一】這題的資料可以直接判斷,在num1和num2之間的數是否符合要求。但有個巨坑需要注意,num1和num2不一定是大小順序給出的!!
【二】但既然學會了篩選法,很明顯可以看到這題先預處理,將10000以內的資料先用判斷函式跑一遍,存表再做會有更高的效率。
而且,作為乙個解題經驗技巧來說,這個完數的條件比較苛刻,也就是所很多很多數裡面才能出現很少的數符合條件,而10000也不是特別大。那麼抱著好奇的心態我會讓跑出來的結果先輸出一遍,看看到底有多少個數。
結果當然沒有讓我失望,只有6,28,496,8128這四個完數!大家都意識到了吧,預處理都可以精簡到幾乎沒有了!不用占用執行的時間咯~
//裸版
#include
intsum(int n)
return s;
}int main()
for (i = num1; i <= num2; i++)
printf("%d\n", count);
}return
0;}
//精裝版
#include
int main()
; scanf("%d",&n);
while(n--)
return
0;}
problemd(hdu4548)
典型的篩法求素數,打表預處理。
先用篩法篩出資料範圍內的素數,再將每個數以內有多少個素數遞推求出來存在表primenums裡。之後求a和b直接就可以直接用primenums[b]-primenums[a]。
這個演算法非常有效率。求primenums表其實是對需求的乙個預處理,而這個預處理前面需要用到的素數表其實又是乙個疊加的預處理。
#include
#include
const
int max_n = 1000001;
bool isprime(int n)
return
true;
}bool ismeiprime(int n)
return isprime(d);
}int primenums[max_n];
bool primes[max_n];
void seive()
}} primenums[0] = 0, primenums[1] = 0;
for (int i = 2; i < max_n; i++) }
int main()
return
0;}
probleme(hdu1164)
將乙個數分解為幾個素數相乘的形式。看資料量很容易想到先預處理,用篩法得到素數表。之後慢慢分解輸入的數,遇到能整除的素數就輸入,並讓其不斷縮小即可。
#include
#include
#include
#include
using
namespace
std;
bool brr[65536];
int arr[7001];
void findprime(void)
}int main()
printf("%d\n",x);
}return
0;}
7 5 實驗 解題參考
problem a hdu1157 排序水題,將輸入資料排序用一次sort,輸出中位數即直接輸入第n 2個位置上的數。include include include using namespace std int a 10010 int main return 0 problem b hdu1106...
7 7 實驗 解題參考
problema hdu2037 這道解題,是希望看到節目盡可能多,那麼安排好前面的節目後,如果剩下的時間更多,能選擇的節目就更多。所以貪心策略是對每個節目的結束時間排序,目的是使剩餘時間留下,再判斷還能看幾個節目。對節目時間的排序結束後,依次判斷,這次要看的節目的開始時間是否大於上次看的節目的結束...
程式設計實驗 期末模擬 解題報告
1001 題目大意 搜尋某個數字在一串數中第一次出現的位置,如果沒有則輸出 1 解題思路 簡單的搜尋題,直接遍歷整個陣列,如下 includeint main 1004 題目大意 檢驗字串是否合法 解題思路 逐位判斷 include includeint valid char s int main ...