codeforces Div.2 899C Dividing the numbers
2017-12-19 12:54
423 查看
大意:
划分1-n的集合,将其分为两个,要求两个集合的和之差最小。
求集合(任意输出)
思路:
容易想到,首位配对的方法去取出来,差值必为0或1(差值为绝对值)
难点在选取。
现在知道差值为0或1
按照奇偶分为两个集合
从后往前检查,如果差值不为0或1
那么讲两个数字交换,交换后必然导致差值-2
当差值为0或1的时候,停止交换,即为答案。
实现代码:
划分1-n的集合,将其分为两个,要求两个集合的和之差最小。
求集合(任意输出)
思路:
容易想到,首位配对的方法去取出来,差值必为0或1(差值为绝对值)
难点在选取。
现在知道差值为0或1
按照奇偶分为两个集合
从后往前检查,如果差值不为0或1
那么讲两个数字交换,交换后必然导致差值-2
当差值为0或1的时候,停止交换,即为答案。
实现代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair <int,int> pii; #define mem(s,t) memset(s,t,sizeof(s)) #define D(v) cout<<#v<<" "<<v<<endl #define inf 0x3f3f3f3f #define pb push_back //#define LOCAL const int mod=1e9+7; const int MAXN =1e5+10; int main() { int n; cin>>n; vector<int> a,b; ll suma=0,sumb=0; for(int i=1;i<=n;i++){ if(i&1) a.pb(i),suma+=i; else b.pb(i),sumb+=i; } ll ret=abs(sumb-suma); for(int i=a.size()-1,j=b.size()-1;i>=0&&j>=0;i--,j--){ swap(a[i],b[j]); ret-=2; if(abs(ret)<=1) break; } cout<<abs(ret)<<endl; cout<<a.size(); for(int i=0;i<a.size();i++){ cout<<" "<<a[i]; } cout<<endl; return 0; }
相关文章推荐
- Codeforces 899 C.Dividing the numbers
- 899C - Dividing the numbers
- Codeforces 834(426 Div.2) C.The Meaningless Game
- codeforces] #398(Div.2) B. The Queue [模拟]
- CodeForces_#354_Div.2_2016.5.25(A+B+C)
- Codeforces 396 div.2 C dp
- Codeforces Round #369 (div.2) 即 Codeforces 711
- 【codeforces】Codeforces Round #441(div.2)
- Codeforces 365(Div.2)A.Mishka and Game【水题】
- [Codeforces] Round #320 (Div.2)
- Codeforces #277.5 (Div.2 A~F)
- codeforces Div.2 #840D Leha and another game about graph 顶点权值为度数对应奇偶
- codeforces 306 div.2 B. Preparing Olympiad
- CodeForces-508A~D篇 div.2
- codeforces 336 Div.2 B. Hamming Distance Sum
- 【Codeforces Round #452 (Div. 2) C】 Dividing the numbers
- codeforces 427 div.2 F. Roads in the Kingdom
- Codeforces Div.2 213 C Matrix (预处理+哈希)
- codeforces 371B - Fox Dividing Cheese
- Codeforces-446(Div.2)-B-Wrath--(线段树区间更新)