7 14 實驗 解題參考

2021-07-14 22:20:12 字數 1774 閱讀 4066

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 ...