题目大意:给定n个数字,使其成为完美的,定义完美指所有数字之间均有整除关系,问最少删除多少数字使得变完美。
解题思路:观察到数字大小为2e5,对数字进行计数。dp[i]定义为所选数字为i的因子时的最大数量,所以每次dp,对i的倍数进行更新。
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 using namespace std; 5 6 typedef long long ll; 7 const int maxn=2e5+5; 8 int t,n; 9 int dp[maxn]; 10 int cnt[maxn]; 11 12 int main() 13 { 14 int t; 15 scanf("%d",&t); 16 while(t--) 17 { 18 memset(cnt,0,sizeof(cnt)); 19 memset(dp,0,sizeof(dp)); 20 scanf("%d",&n); 21 for(int i=1;i<=n;i++){ 22 int tmp; 23 scanf("%d",&tmp); 24 cnt[tmp]++; 25 } 26 int ans=-1; 27 for(int i=1;i<maxn;i++){ 28 dp[i]+=cnt[i]; 29 for(int j=i+i;j<maxn;j+=i){ 30 dp[j]=max(dp[i],dp[j]); 31 } 32 ans=max(ans,dp[i]); 33 } 34 printf("%d ",n-ans); 35 } 36 return 0; 37 }