15pts 多数RE求解
查看原帖
15pts 多数RE求解
784606
wuwendi123楼主2024/11/25 00:01
#include<bits/stdc++.h>

using namespace std;
int T,n,k;
struct node{
    int l,r;
} a[1005],b[1005];
int cmp(node x,node y){  //按区间长度排序  长度一样按照左端点排序
    if(x.r - x.l != y.r - y.l) return x.r - x.l < y.r - y.l;
    return x.l < y.l;
}
void out(int k){
    cout<<"Yes\n";
    for(int i=1;i<=n;i++){   //   7     15-25
        int t = (a[i].l-1)/k*k+k;   //找大于等于l的最近的k的倍数
        cout<<t<<' ';
    }
    cout<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
	cin>>T;
	while(T--){
	    cin>>n>>k;
	    for(int i=1;i<=n;i++){
	        cin>>a[i].l>>a[i].r;
	        b[i] = a[i];
	    }
	    sort(b+1,b+n+1,cmp);
	    if(b[1].r - b[1].l + 1 >= k){ // 区间最短的都大于等于k,一定有k的倍数
	        out(k);
	        continue;
	    }
	    //找出最短区间的所有数字的所有因数。。。一个一个试看看是否能 在其他区间找到j的倍数
	    set<int> v; //记录最小区间的所有约数,用set方便去重
	    v.clear();
	    for(int i=b[1].l;i<=b[1].r;i++){
	        for(int j=1;j*j<=i;j++){
	            if(i % j == 0){
	                if(j >= k) v.insert(j);
	                if(i / j >= k)  v.insert(i/j);
	            }
	        }
	    }
	    
	    int flag2 = 1;
	    for(auto x:v){  //遍历所有约数 x
	        int flag = 1;
	        vector<int> vv;
	        vv.clear();
	        for(int i=1;i<=n;i++){   //检查每一个区间   
    	        int t = (a[i].l-1)/x*x+x;   //找大于等于当前区间左端点的x的倍数
    	        if(t > a[i].r){   //大于右端点,说明不存在
    	            flag = 0;
    	            break;
    	        }
    	        vv.push_back(t);// 存答案
    	    }
    	    if(flag) {   //有解
    	        flag2 = 0;
    	        cout<<"Yes\n";
    	        for(auto c:vv) cout<<c<<' ';
    	        cout<<endl;
    	        break;
    	    }
	    }
	    if(flag2 == 1) cout<<"No\n";
	    
	}
	return 0;
}
2024/11/25 00:01
加载中...