A. Sorting Parts
签到题
思路
n个数,分别将1~(n-1) 长度的前后缀进行排序,如果某次不是非降序就输出"YES",否则输出"NO"
就是因为前后缀长度从1开始,所以只要原始的数组里有一个数是不满足非降序的,那么在之后的某次排序中一定不满足非降序
eg: 2 1 4 5 6
排序,先是对 长度为1的前后缀排序,仍然是 2 1 4 5 6 不满足非降序
代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int Bool;
typedef long long ll;
#define MS(a, b) memset(a, b, sizeof(a))
int compare(const void* a, const void* b);
ll s[N];
int main() {
int T;
scanf("%d", &T);
while (T--) {
int n = 0;
MS(s, 0);
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%lld", &s[i]);
}
int flag = 0;
for (int i = 1; i < n; i++) {
if (s[i] < s[i - 1]) flag = 1;
}
if (flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
int compare(const void* a, const void* b) {
ElementType * s1 = (ElementType*)a;
ElementType * s2 = (ElementType*)b;
if (*s1 > *s2) return 1;
else
if (*s1 == *s2) return 0;
else return -1;
}
C. Andrew and Stones
签到题…但是我还是没看懂
思 路
n堆石子,每堆ai个,选三个数 1 ≤ i < j < k ≤ n,并且 j 必须大于等于2
将j中石子,每次向 i 放一个 向k 放一个
问是否能把所有石子都移动到 第一堆和最后一堆里
分情况
- n == 3 ,中间如果是奇数就不能
- n为任意,中间全是1,不能移动石子,输出-1
- 满足情况的
所以直接在遍历的时候判断是不是全是1即可,
然后记录下最小的步数为,(s[i] + 1) / 2的和
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
typedef int Bool;
typedef long long ll;
typedef unsigned long long ull;
#define N 100000+5
#define MS(a, b) memset(a, b, sizeof(a))
/*应该是除了 n == 3 时中间的数是奇数,和任意n的所有中间数都小于2,之外的情况都可以*/
ll s[N], sum, ans;
int main() {
int T, n;
scanf("%d", &T);
while (T--) {
sum = 0;//记录总步数 (s[i] + 1) / 2
ans = 0;//判断是否全是 1
MS(s, 0);
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%lld", &s[i]);
for (int i = 1; i < n - 1; i++) {
ans |= (s[i] > 1) ;
sum += (s[i] + 1) / 2;
}
if (!ans || (n == 3 && s[1] % 2 == 1)) printf("-1\n");
else printf("%lld\n", sum);
}
return 0;
}