自我思考,仅仅记录学习过程,俯冲灰名
暴力就行,一个最大的配合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;
}