原题传送器<----点我
题意:n个数字,请你给它们排个序围成一个环,满足任意一个数两边的数之和大于它本身,例如题目给的图(左图为正确答案),如果不存在这样的环就输出NO。
难度★
题解
这题主要靠思路,能想到正确的方法就很easy,码量不多。
对于这组数我们可以先排升序,然后取后三位比较(为什么,往下看) ,例如后三位是a[n-2],a[n-1],a[n],然后比较a[n]>a[n-1]+a[n-2]是否成立,如果不成立就说明肯定不能成环,反手就是输出NO;如果成立,先将a[n]和a[n-1]输出,然后除了a[n-2]的其他数直接输出就行,把a[n-2]最后输出;
即a[n] a[n-1] a[1] a[2] …a[n-3]
因为我们排过序,所以a[1]到a[n-3]都是升序列,两边数之和绝对大于它本身(光右边的数就大于),然后因为我们特判过所以a[n]<a[n-1]+a[n-2],而且a[n]为最大数,a[n-1],a[n-2]都小于它,所以也满足,这样所有数都满足了。
其实感觉这题也就A题的难度,讲的有点啰嗦,大致能明白就行。
上代码
#include #include #include #include using namespace std; int a[100003]; int main() { int n; scanf("%d",&n); for(int i=1;in;i++) scanf("%d",&a[i]); sort(a+1,a+1+n,lessint>()); if(a[n](a[n-1]+a[n-2])) { cout"YES"endl; couta[n]" "a[n-1]" "; for(int i=n-3;i>=1;i--) { printf("%d ",a[i]); } couta[n-2]; } else cout"NO"; return 0; }
写完题解,睡觉
0:35
~~
INPUT
Output
Examples
题意:
有个长度我n的字符串,然后把它分成k分,要使每份都good且为正数(good的要求为该数中0和1的个数不同),求输出最小的结果(答案不唯一输出一个即可)
难度★
题解:果然是cf典型的A题,只要能想明白,难度并不***r> 第一步:先判断整体1和0的个数,如果不同直接输出1和它本身
第二步:如果不同,先输出二(因为最小的结果就是拆成两个字符串,让两个都good),然后将第一个数和后面所有数拆开输出,这样后面的数绝对满足good(因为它原本1和0相等,现在拆走一个就肯定不相等),这样就OK了。
这个题简单就在于答案很多,满足一个即可,而最简单的就是把第一个数和后面拆开。
#include//万能头文件让我快乐 using namespace std; int main() { int ans1,ans2; int n; string m; while(~scanf("%d"),&n) { cin >> m; ans1= 0,ans2 = 0; for(int i = 0;i < n;i++) { if(m[i] == '1') ans1++; else ans2++; } if(ans2 != ans1) cout <<1<<endl<<m<< endl; else { printf("2\n"); printf("%d",m[0]); for(int i = 1;i < n;i++)cout << m[i]; cout << endl; } } return 0; }
每天水A题,天天没烦恼。。。(下回做点难的,不能再混了。。)
~~