A题暴力扫几遍就行
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,a[105],b[106]; 4 int main(){ 5 int T; 6 scanf("%d",&T); 7 while (T--){ 8 scanf("%d",&n); 9 for (int i=1; i<=n; i++) scanf("%d",&a[i]); 10 memset(b,0,sizeof(b)); 11 int tot=n,res=0; 12 while (tot>0){ 13 res++; 14 int last=0; 15 for (int i=1; i<=n; i++){ 16 if (!b[i]){ 17 if (a[i]>last) { 18 b[i]=1; 19 tot--; 20 last=a[i]; 21 } 22 } 23 } 24 } 25 printf("%d ",res); 26 } 27 }
B题是个奇怪的结论题,大概就是大于10倍的都行,整除的都行,减掉几十后整除的也行。
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int q,d; 4 int a[10005]; 5 int main(){ 6 int T; 7 scanf("%d",&T); 8 while(T--){ 9 scanf("%d%d",&q,&d); 10 for (int i=1; i<=q; i++) scanf("%d",&a[i]); 11 for (int i=1; i<=q; i++){ 12 if(a[i]>=(d*10+1)) { 13 printf("YES "); 14 continue; 15 } 16 else if(a[i]%d==0) { 17 printf("YES "); 18 continue; 19 } 20 else{ 21 int flag=0; 22 for(int j=1; j<=10; j++){ 23 if ((a[i]>j*10) && ((a[i]-10*j)%d==0)) { 24 flag=1; 25 break; 26 } 27 } 28 if (flag) { 29 printf("YES "); 30 continue; 31 } 32 } 33 printf("NO "); 34 } 35 } 36 }
C题:这道题把点在数轴上排一排就很好做,因为公式一看就是距离公式,那么距离和的话,最外面两个点肯定包含了所有点,所以按照到两点的距离的性质,整个的距离就是最外面两点的n倍,所以最大的数是d[i]/2n,之后就按照这样一层一层推进去的就行,推得进去就是对的。
但是这道题有几个比较怪的地方要特判一下(WA了好多发),一个是他是不允许数是零的还有一个是相邻两组点的距离和不允许相等(这个是肯定的),但是原来我觉得这样递推下去肯定会错就没管,没想到实际上居然推得出来,所以要特判判掉。
代码:
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 ll a[200005]; 5 int main(){ 6 ll T; 7 scanf("%lld",&T); 8 while (T--){ 9 ll n; 10 scanf("%lld",&n); 11 for (ll i=1; i<=2*n; i++){ 12 scanf("%lld",&a[i]); 13 } 14 ll flag=1; 15 sort(a+1,a+1+2*n); 16 for (ll i=1; i<=2*n; i+=2){ 17 if (a[i]%2==1 || a[i]!=a[i+1]) { 18 flag=0; 19 } 20 } 21 ll now=0; 22 for (ll i=2*n; i>=1; i-=2){ 23 if (((a[i]-now*2)%i==0) && ((a[i]-now*2)>0) && (a[i]!=0) && (a[i]!=a[i-2])){ 24 ll tmp=(a[i]-now*2)/i; 25 now+=tmp; 26 } 27 else { 28 flag=0; 29 break; 30 } 31 } 32 if (flag==0){ 33 printf("NO "); 34 continue; 35 } 36 printf("YES "); 37 } 38 }
D题:做出来的最后一题,一道数论题
代码:
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const ll INF=0X3f3f3f3f3f3f3f3f; 5 ll n,k,a[200005],de[200005]; 6 ll gcd(ll a,ll b){ 7 return b == 0 ? a : gcd(b, a % b); 8 } 9 int main(){ 10 int T; 11 scanf("%d",&T); 12 while (T--){ 13 scanf("%lld%lld",&n,&k); 14 ll minn=INF; 15 for (int i=1; i<=n; i++){ 16 scanf("%lld",&a[i]); 17 minn=min(minn,a[i]); 18 } 19 for (int i=1; i<=n; i++){ 20 de[i]=a[i]-minn; 21 } 22 ll ret=0; 23 for (int i=1; i<=n; i++){ 24 ret=gcd(ret,de[i]); 25 } 26 int flag=0; 27 for (int i=1; i<=n; i++){ 28 if (ret==0 && a[i]-k==0){ 29 flag=1; 30 break; 31 } 32 else if (ret!=0 && abs(a[i]-k)%ret==0){ 33 flag=1; 34 break; 35 } 36 } 37 if (flag) printf("YES "); 38 else printf("NO "); 39 } 40 }