Codeforces Round #638 (Div. 2) A~D

自我思考,仅仅记录学习过程,俯冲灰名


暴力就行,一个最大的配合n/2-1个最小的


#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(j); i<(k); ++i)
#define pb push_back
#define PII pair<int,int>
#define PLL pair<long long, long long>
#define ini(a,j) memset(a,j,sizeof j)
#define rrep(i,j,k) for(int i=j; i>=k; --i)
#define fi first
#define se second
#define LL long long
#define beg begin()
#define ed end()
#define all(x) x.begin(),x.end()
const int N=2e5+10;
LL a[33];
int main(int argc, char const *argv[])
{
	// #define DEBUG
	#ifdef DEBUG
		freopen("1.dat","r",stdin);
		freopen("ans.dat","w",stdout);
	#endif
	int _;
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>_;
	for (int i = 1; i < 33; ++i)
	{
		a[i]=(1LL<<i);
	}
	while(_--){
		int n;
		cin>>n;
		LL temp=0;
		rep(i,1,(n>>1)){
			temp += a[i];
		}
		temp += a[n];
		LL sum=0;
		rep(i,1,n+1){
			sum+=a[i];
		}
		cout<<abs(sum-2*temp)<<endl;

	}
	return 0;
}

如果出现的数不重复的数个数超过K的话,那就不可能使得相等,因为无法调和
否则直接构造K个包括前面所有不重复的数字的序列,重复输出N次


#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(j); i<(k); ++i)
#define pb push_back
#define PII pair<int,int>
#define PLL pair<long long, long long>
#define ini(a,j) memset(a,j,sizeof j)
#define rrep(i,j,k) for(int i=j; i>=k; --i)
#define fi first
#define se second
#define LL long long
#define beg begin()
#define ed end()
const int N=2e5+10;
int a[N];
int occur[101];
vector<int> ans;
int main(int argc, char const *argv[])
{
	// #define DEBUG
	#ifdef DEBUG
		freopen("1.dat","r",stdin);
		freopen("ans.dat","w",stdout);
	#endif
	int _;
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>_;
	while(_--){
		ans.clear();
		memset(occur,0,sizeof occur);
		int n,k;
		cin>>n>>k;
		int cnt=0;
		rep(i,0,n){
			cin>>a[i];
			if(occur[a[i]]==0){
				cnt++;
				occur[a[i]]=1;
				ans.pb(a[i]); 
			}

		}
		if(cnt>k)
			cout<<-1<<endl;
		else{ 
			rep(i,cnt,k)
				ans.pb(1);
				cout<<ans.size()*n<<endl;
		rep(i,0,n)
			rep(j,0,ans.size())
				cout<<ans[j]<<" ";
		cout<<endl;
		}
	}
	return 0;
}

首先,我们肯定要先是得k个串非空,在这里先把s排序,那么就取前k个
这时候,如果前k个就不全相同,则答案就是s[k-1],否则,考虑剩下的n-k个
如果都相等,那么最优答案就是均匀分配,否则,把剩下的所有的都加
到最后一个串就是答案。


#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(j); i<(k); ++i)
#define pb push_back
#define PII pair<int,int>
#define PLL pair<long long, long long>
#define ini(a,j) memset(a,j,sizeof j)
#define rrep(i,j,k) for(int i=j; i>=k; --i)
#define fi first
#define se second
#define beg begin()
#define ed end()
#define LL long long
#define all(x) x.begin(),x.end()
const int N=1e5+10;
string a;
int cnt[26];
int main(int argc, char const *argv[])
{
	// #define DEBUG
	#ifdef DEBUG
		freopen("1.dat","r",stdin);
		freopen("ans.dat","w",stdout);
	#endif
	int _;
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>_;
	while(_--){
		int n,k;
		cin>>n>>k;
		cin>>a;
		string ans;
		memset(cnt,0,sizeof cnt);
		sort(a.begin(),a.end());
		if(k==n||a[0]!=a[k-1]){
			cout<<a[k-1]<<endl;
			continue;
		}else{
			ans = a[k-1];
			if(a[k]==a[a.length()-1]){
				rep(i,0,ceil(1.0*n/k)-1){
					ans+=a[k];
				}
			}
			else
				rep(i,k,a.length())
					ans+=a[i];


		}
		cout<<ans<<endl;
	}
	return 0;
}

做的时候想的是贪心的去最大化每晚的收益,但是没有想到是贪心的去找每一天晚上的增量
首先我们可以知道:假设前一天有n个bacte,那么这一天晚上的增加的mass可以是n~2*n,总之
只要保证增量不超过前一天的增量的两倍并且是非降得就行,所以可以先构造这样一个序列,增量分别是
2^i for i from 0 to k st. sigma(2^i)<= n得最大k,然后判断如果相等,那么结果就是每一项减去前一项
否则,把n-这个和插入序列然后排序,每一项减去前一项就得到结果


#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(j); i<(k); ++i)
#define pb push_back
#define PII pair<int,int>
#define PLL pair<long long, long long>
#define ini(a,j) memset(a,j,sizeof j)
#define rrep(i,j,k) for(int i=j; i>=k; --i)
#define fi first
#define se second
#define LL long long
#define beg begin()
#define ed end()
#define all(x) x.begin(),x.end()
const int N=2e5+10;
vector<int> ans;
int main(int argc, char const *argv[])
{
	// #define DEBUG
	#ifdef DEBUG
		freopen("1.dat","r",stdin);
		freopen("ans.dat","w",stdout);
	#endif
	int _;
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>_;
	while(_--){
		int n;
		cin>>n;
		ans.clear();
		int sum=1;
		ans.pb(1);
		int cnt=1;
		while(sum<n){
			ans.pb(1<<cnt);
			sum += (1<<cnt);
			cnt++;
		}
		if(sum==n){
			cout<<ans.size()-1<<endl;
			rep(i,1,ans.size())
				cout<<ans[i]-ans[i-1]<<" ";
			cout<<endl;
		}
		else{
			ans.back()=(n-sum+ans.back());//超过了
			sort(all(ans));
			cout<<ans.size()-1<<endl;
			rep(i,1,ans.size())
				cout<<ans[i]-ans[i-1]<<" ";
			cout<<endl;
		}
	}
	return 0;
}
posted @ 2020-05-02 09:39  CrosseaLL  阅读(188)  评论(2编辑  收藏  举报