Codeforces Round 921 (Div. 2)

A. We Got Everything Covered!

#include
#define endl '\n'
#define int long long
using namespace std;
int n,k;
void solve() {
	cin>>n>>k;
	string tmp;
	for(int i=0;i<k;i++){
		tmp+=(char)('a'+i);
	}
	for(int i=0;i<n;i++) cout<<tmp;
	cout<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

B. A Balanced Problemset?
x=a+b+c+d
假设a,b,c,d的最大公因数是g,那么a=k1 * g,b=k2 * g,c=k3 * g,d=k4 * g
x=(k1+k2+k3+k4)*g,所以g是x的因数,那么最大公因数只要在x的因数里选就行了,只要x/g大于等于n即可,因为至少要分成n组,枚举因数需要根号x,因为枚举g,同时得到x/g

#include
#define endl '\n'
#define int long long
using namespace std;
int x,n;
void solve() {
	cin>>x>>n;
	int ans=0;
	for(int i=1;i<=x/i;i++){
		if(x%i==0){
			int a=i,b=x/i;
			if(x/a>=n) ans=max(ans,a);
			if(x/b>=n) ans=max(ans,b);
		}
	}
	cout<<ans<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

C. Did We Get Everything Covered?
从头开始遍历,只要k个字母齐了就作为一组,最后如果组数大于等于n那么yes,否则no
选反例的话,就选每组的最后一个字母加上最后一组没出现的字母,因为每组的最后一个字母都是每组前面没出现过的字母,比如说aaaaab bbbb
第一组最后的字母是b,如果在该组前面出现过了,那么这一组早结束了,所以b在这一组只在最后出现了一次,这样选择每组的最后一个字母,就不会在前面出现过

#include
#define endl '\n'
#define int long long
using namespace std;
int n,k,m;
string s;
void solve() {
	cin>>n>>k>>m;
	cin>>s;
	set<char>se;
	map<char,int>mp;
	int cnt=0;
	vector<char>res;
	for(int i=0;i<(int)s.size();i++){
		mp[s[i]]++;
		se.insert(s[i]);
		if((int)se.size()==k){
			cnt++;
			se.clear();
			res.push_back(s[i]);
		}
		if(cnt>=n){
			cout<<"Yes"<<endl;
			return;
		}
	}
	cout<<"No"<<endl;
	char c;
	for(int i=1;i<=k;i++){
		char ch=(char)('a'+i-1);
		if(!se.count(ch)){
			c=ch;
			break;
		}
	}
	res.push_back(c);
	for(auto v:res) cout<<v;
	for(int i=cnt+1;i<n;i++) cout<<c;
	cout<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

你可能感兴趣的:(codeforces,算法,c++)