标签:数学 lse 很多 stream family 解法 phoenix 个数 set
题意:有n个硬币,每一个硬币符合以下关系:21,22.....2n。其中n是偶数,要你将这堆硬币分为两堆,是两堆的重量之差的绝对值最小。
题解:这道题是一个规律题,同时也是一道数论题,解法有很多。这里利用一个数学结论:21+22+23+24+2n-1=2n-1,也就是说2n比前面的和还大,这个时候,我们将前面的n/2-1个数和分给第一个组,后面的分给下一个组,两者之差为最小值。
代码:
#include<iostream> #define ll long long using namespace std; int main(){ int n,t; cin>>n; while(n--){ cin>>t; ll ans=1<<t; for(int i=1;i<=t-1;i++){ if(i<t/2){ ans=ans+(1<<i); }else{ ans=ans-(1<<i); } } cout<<ans<<endl; } return 0; }
题意:给你一个序列,要你向其中插入若干个数实其成为“完美数列”。
题解:这个题是一个构造里面的接单题,关键是找到不可构造的条件,原数列数字的种类数--这个是关键。
代码:
#include<iostream> #include<set> #include<vector> using namespace std; int main(){ int t,n,k; cin>>t; int temp; while(t--){ cin>>n>>k; set<int> se; vector<int> ve; se.clear(); ve.clear(); for(int i=0;i<n;i++){ cin>>temp; se.insert(temp); } if(se.size()>k){ cout<<-1<<endl; continue; } set<int>::iterator it; for(it=se.begin();it!=se.end();it++){ ve.push_back(*it); } int len=ve.size(); if(len==k){ }else{ for(int i=0;i<k-len;i++){ ve.push_back(1); } } cout<<n*ve.size()<<endl; for(int i=0;i<n;i++){ for(int j=0;j<ve.size();j++){ cout<<ve[j]; if(i==n-1&&j==ve.size()-1){ cout<<endl; }else{ cout<<" "; } } } } return 0; }
Codeforces Round #638 (Div. 2)(A~B)
标签:数学 lse 很多 stream family 解法 phoenix 个数 set
原文地址:https://www.cnblogs.com/blogxsc/p/12913784.html