题目
说实话,没看懂这个C的作用,找个里面的最大数不久可以了吗
这个题目就是说对于任意A[i] 大于A[j] ,如果A[i]/A[j]也在数组里面,那么就输出YES,否则No
最朴素的想法就是枚举每个数字,但是这样肯定超时
那对于每个元素考虑,不妨枚举他的倍数
a[i]/a[j]=b;
也就是说去枚举这个a[j]和这个b
如果范围内存在这么个a[i],也就要求a[i]/a[j]存在
(逆向思考)
所以这里要用到前缀和
#include<bits/stdc++.h>
using namespace std;
int a[1000010];
int v[1000010];
int dp[1000010];
int main(){
int t,c;
cin>>t;
while(t--){
int n;
cin>>n>>c;
for(int i=1;i<=c;i++){
v[i]=0;
dp[i]=0;
}
for(int i=1;i<=n;i++){
cin>>a[i];
v[a[i]]=1;
}
for(int i=1;i<=c;i++){
dp[i]=dp[i-1]+v[i];
}
if(!v[1]){
cout<<"NO"<<endl;
continue;
}
int flag=0;
for(int i=2;i<=c;i++){
if(!v[i]) continue;
for(int j=1;j<=(c/i)+2;j++){
if(i*j-1>c) continue;
if((dp[min(c,i*(j+1)-1)]-dp[i*j-1])!=0){
if(!v[j]){
flag=-1;
}
}
}
}
if(flag==-1){
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
}
然后做出来了,注意
if((dp[min(c,i*(j+1)-1)]-dp[i*j-1])!=0){
这里记得加上min(c,i*(j+1)-1)
不加的话可能会溢出导致误判
其次如果i*j-1都大于c了,那么就不需要考虑了
主要还是边界条件的判断问题得弄清楚
(WA了4次)
好吧,事实上是C确实也可以说是不需要,不用C也能够A
#include<bits/stdc++.h>
using namespace std;
int a[1000010];
int v[1000010];
int dp[1000010];
int main(){
int t,c;
cin>>t;
while(t--){
int n,xxx;
cin>>n>>xxx;
c=0;
for(int i=1;i<=n;i++){
cin>>a[i];
c=max(c,a[i]);
}
for(int i=1;i<=c;i++){
v[i]=0;
dp[i]=0;
}
for(int i=1;i<=n;i++){
v[a[i]]=1;
}
for(int i=1;i<=c;i++){
dp[i]=dp[i-1]+v[i];
}
if(!v[1]){
cout<<"NO"<<endl;
continue;
}
int flag=0;
for(int i=2;i<=c;i++){
if(!v[i]) continue;
for(int j=1;j<=(c/i)+2;j++){
if(i*j-1>c) continue;
if((dp[min(c,i*(j+1)-1)]-dp[i*j-1])!=0){
if(!v[j]){
flag=-1;
}
}
}
}
if(flag==-1){
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
}
前提是你得先预处理数组a[i],实际上a[i]也可以是不需要的,换成x也行
That is all.