签到题
思路n个数,分别将1~(n-1) 长度的前后缀进行排序,如果某次不是非降序就输出"YES",否则输出"NO"
就是因为前后缀长度从1开始,所以只要原始的数组里有一个数是不满足非降序的,那么在之后的某次排序中一定不满足非降序
eg: 2 1 4 5 6
排序,先是对 长度为1的前后缀排序,仍然是 2 1 4 5 6 不满足非降序
#includeC. Andrew and Stones#include #include 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("YESn"); else printf("NOn"); } 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; }
签到题…但是我还是没看懂
思 路n堆石子,每堆ai个,选三个数 1 ≤ i < j < k ≤ n,并且 j 必须大于等于2
将j中石子,每次向 i 放一个 向k 放一个
问是否能把所有石子都移动到 第一堆和最后一堆里
分情况
- n == 3 ,中间如果是奇数就不能n为任意,中间全是1,不能移动石子,输出-1满足情况的
所以直接在遍历的时候判断是不是全是1即可,
然后记录下最小的步数为,(s[i] + 1) / 2的和
#include#include #include #include #include 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)) 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("-1n"); else printf("%lldn", sum); } return 0; }



