• 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;
    }
    
  • 相关阅读:
    java线程
    面向切面编程
    控制反转IOC与依赖注入DI
    phpexecel 导入导出,格式
    PHPExcel设置数据格式的几种方法
    九度oj 题目1416:猴子吃坚果
    九度oj 题目1397:查找数段
    poj 1065 Wooden Sticks
    poj 3181 Dollar Dayz
    poj 1742 Coins
  • 原文地址:https://www.cnblogs.com/Crossea/p/12816906.html
Copyright © 2020-2023  润新知