Codeforces Round #582 (Div. 3) E next_permutation()

C
n=100 m=3
把n以内 所有3的倍数 的数个位求和
找周期

ll n,m,k,q,t,sum1,sum2,num,ans=INF,cnt;
ll a[maxn],vis[maxn],res;
vector<int> v[maxn];
int main(){
	cin>>q;
	while(q--){
		cin>>n>>m;
		sum1=0,sum2=0,res=0;
		num=m;
		while(num%10){
			sum1+=num%10;	//1个周期的和 
			num+=m;
		}
		t=n/num;	// 100/30=3轮 到90
		res=n%num;	//还剩10
		sum2+=sum1*t;
		num=0;
		num=m;
		while(num<=res){
			sum2+=num%10;
			num+=m;
		}
		cout<<sum2<<endl;
	}
	return 0;
}

D2
使k个相同的最小次数
n,k<=2e5
n=4 k=3
1 2 2 4 5

1

#include <bits/stdc++.h>
using namespace std;
 
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define pb push_back
#define mp make_pair
#define IO ios::sync_with_stdio(false)
#define fi first
#define se second
 
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=2e5+5;
const int maxm=1e6+5;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
 
ll n,m,k,sum1,num,cnt1,ans=INF,cnt2,cnt;
ll a[maxn],vis[maxn],ave;
vector<int> v[maxn];
int main(){
	cin>>n>>k;
	rep(i,1,n){
		cin>>a[i];
		cnt=0;
		while(a[i]){
			v[a[i]].pb(cnt);
			cnt++;
			a[i]/=2;
		}
		v[0].pb(cnt);
	}
	for(int i=0;i<=2e5;i++){
		if(v[i].size()<k)
			continue;	
		num=0;
		sort(v[i].begin(),v[i].end());
		for(int j=0;j<k;j++){
			num+=v[i][j];
		}
		ans=min(ans,num);
	}
	cout<<ans<<endl;
	return 0;
}

E
字符串包含n个a,n个b,n个c
长度为2 的字符串s和t
构造结果只有12种 满足不包含子串s/t
next_permutation()函数 返回bool值 找不到下一个排列 false
string(n,jwj[0]) 把字符复制n次 构成字符串

ll n,m,k,q,sum1,sum2,num,cnt;
ll a[maxn],vis[maxn];
vector<string> ans;
string s,t;
int main(){
	cin>>n;
	cin>>s>>t;
	cout<<"YES"<<endl;
	string jwj="abc";
	do{
		string tmp="";
		for(int i=0;i<n;i++)
			tmp+=jwj;
		ans.pb(tmp);
		ans.pb(string(n,jwj[0])+string(n,jwj[1])+string(n,jwj[2]));
	}while( next_permutation( jwj.begin(),jwj.end() ) );	//循环6次 构造12个 每个都包含n个a/b/c 
	for(auto k:ans){
		if(k.find(s)==string::npos && k.find(t)==string::npos)	//k找不到s和t的子串 
		{
			cout<<k<<endl;
			return 0;
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值