題目大意:
給定n個不同的數和p,要求選擇盡可能多的數,使得選擇的數中,任意兩個大的都不是小的p倍。
數值<=1e9。
題解:首先排個序。然後從小到大考慮每個數字,如果當前數字沒有被「排斥」,就cnt++,並把它排斥的(即比他大的且是它p倍)數排斥走。
最後cnt就是答案。
如果不用map的話辣不就是hash麼。
然而並不想寫雙hash,一開始mod用的1e5+3,全wa
後來改為1e6+7,wa四個
後來改為1e8+3,wa乙個
後來改為102030405,就ac了啊啊23333333336666666666..........
hash**如下:
#include#include#include#define maxn 100010
#define mod 102030405
#define ull unsigned long long int
using namespace std;
int a[maxn];
bool hash[mod+5];
int main()
sort(a+1,a+n+1);
int cnt=0;
for(int i=1;i<=n;i++)
if(hash[a[i]%mod])
printf("%d\n",cnt);return 0;
}
CODEVS 1553 互斥的數
有這樣的乙個集合,集合中的元素個數由給定的n決定,集合的元素為n個不同的正整數,一旦集合中的兩個數x,y滿足y p x,那麼就認為x,y這兩個數是互斥的,現在想知道給定的乙個集合的最大子集滿足兩兩之間不互斥。輸入有多組資料,每組第一行給定兩個數n和p 1 n 10 5,1 p 10 9 接下來一行包...
codevs 1553 互斥的數
時間限制 1 s 空間限制 128000 kb 題目等級 gold 題目描述 description 有這樣的乙個集合,集合中的元素個數由給定的n決定,集合的元素為n個不同的正整數,一旦集合中的兩個數x,y滿足y p x,那麼就認為x,y這兩個數是互斥的,現在想知道給定的乙個集合的最大子集滿足兩兩之...
互斥的數(codevs 1553)
題目描述 description 有這樣的乙個集合,集合中的元素個數由給定的n決定,集合的元素為n個不同的正整數,一旦集合中的兩個數x,y滿足y p x,那麼就認為x,y這兩個數是互斥的,現在想知道給定的乙個集合的最大子集滿足兩兩之間不互斥。輸入描述 input description 輸入有多組資...