3 条题解
-
3
#include<iostream> #include<queue> #include<stack> #include<math.h> #include<string.h> #include<algorithm> using namespace std; const int maxn=1e5+10; int number[maxn]; int main(){ int n; scanf("%d", &n); while(n--){ int m; scanf("%d", &m); for(int i=0;i<m;i++){ scanf("%d", &number[i]); } int ans=0,k; while(m>1){ sort(number+ans,number+m); for(int i=ans;i<m;i++){ if(number[i]==0){ ans++; }else{ break; } } if(ans>0){ ans--; } k=ans; for(int i=k;i<m-1;i++){ number[i]=number[i+1]-number[i]; } m--; } printf("%d\n", number[ans]); } }
-
2
#include<cstdio> #include<algorithm> using namespace std; int a[100001]; int main() { int t; scanf("%d",&t); int n; int i,j; while(t--) { int n; scanf("%d",&n); j=-2; for(i=0;i<n;i++) { scanf("%d",&a[i]); if(a[i]!=0&&j==-2)j=i-1; } if(j<0)j=0; while(n!=1) { for(i=j;i<n-1;i++) a[i]=a[i+1]-a[i]; n--; while(j<n&&a[j]==0)j++; if(j>0)j--; sort(&a[j],&a[n]); } printf("%d\n",a[0]); } return 0; }
-
2
首先一眼题可以想到是差分+排序,每一次操作都排,但说实话不见得每次排序把所有元素全部排一遍,前面是0的可以忽略不计,因为不管怎么排,0始终在前面,所以只需要排后面的非零元素就好啦,然后上个代码:
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; int a[N]; int main() { int t; scanf("%d", &t); while (t--) { int n; scanf("%d", &n); int ans = n; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } for (int i = 1; i <= n; i++) { if (a[i] != 0) { ans = i - 1; break; } } if (ans == 0) { ans = 1; } while (n > 1) //找第一个不为0的位置的前一个位置,因为如果是0的话,那相减还是0,排序后还是在最前面,排了也没用 { for (int i = ans; i <= n; i++) { a[i] = a[i + 1] - a[i]; } --n; sort(a + ans, a + 1 + n); if (ans > 1) { ans--; } while (ans + 1 <= n && a[ans + 1] == 0) { ++ans; } } printf("%d\n", a[1]); } return 0; }
- 1
信息
- ID
- 817
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 332
- 已通过
- 28
- 上传者