思路
从样例入手分析一波
输入:
4 2
1 2 3 4
输出: 3
也就说 如果去掉 1 那么还得去掉4 不是最优解
但是如果通过1 去掉 1*2 那么就不用去掉4了 极有可能是最优解
之后造了几组数据 手推了一波 发现我这个“贪心”算法很有可能是正确的。
那么实现思路就出现了:
先排个序,之后用两个set维护。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <cstdio> 2 #include <set> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 set<int>used; 7 set<int>now; 8 int n,m,tot,a[1000005]; 9 int main(){ 10 scanf("%d%d",&n,&m); 11 for(int i=1;i<=n;i++){ 12 scanf("%d",&a[i]); 13 } 14 sort(a+1,a+1+n); 15 for(int i=1;i<=n;i++){ 16 if(!used.count(a[i])){ 17 tot++; 18 now.insert(a[i]); 19 used.insert(a[i]*m); 20 } 21 } 22 printf("%d",tot); 23 return 0; 24 }