这次BC终于不像上次一样惨烈 终于A了三题……
终测ing……
发一波题解……
A题十分无脑 只要把所有数加起来存到sum里 询问的时候大于sum输出1 否则输出0就行了……
犹豫了好久 怎么会这么简单……
看群里好多人卡在了%I64d……
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6 #include<string> 7 #include<map> 8 #include<vector> 9 #include<queue> 10 #define M(a,b) memset(a,b,sizeof(a)) 11 using namespace std; 12 int main(){ 13 int T; 14 scanf("%d",&T); 15 while(T--){ 16 int n,m; 17 scanf("%d%d",&n,&m); 18 long long sum=0,a; 19 for(int i=0;i<n;i++){ 20 scanf("%I64d",&a); 21 sum+=a; 22 } 23 for(int i=0;i<m;i++){ 24 scanf("%I64d",&a); 25 if(a>sum) printf("1"); 26 else printf("0"); 27 } 28 puts(""); 29 } 30 return 0; 31 }
B题就是自行模拟一下就好了……
cha[i]是这个数和前一个数的差……
记录最大的差maxc和i的位置loc……
首先处理去掉开头和结尾的情况……
然后处理中间的情况……
处理到loc和loc-1单独处理……
边界没处理好 WA了6次……
感觉是做麻烦了……
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6 #include<string> 7 #include<map> 8 #include<vector> 9 #include<queue> 10 #define M(a,b) memset(a,b,sizeof(a)) 11 using namespace std; 12 int num[100005]; 13 int cha[100005]; 14 int main(){ 15 int T; 16 scanf("%d",&T); 17 while(T--){ 18 int n; 19 int loc; 20 int maxc=-1; 21 int maxn=-1; 22 long long ans=0; 23 scanf("%d",&n); 24 scanf("%d",&num[0]); 25 for(int i=1;i<n;i++){ 26 scanf("%d",&num[i]); 27 cha[i]=abs(num[i]-num[i-1]); 28 if(cha[i]>maxc){ 29 maxc=cha[i]; 30 loc=i; 31 } 32 } 33 for(int i=2;i<n;i++){ 34 if(cha[i]>maxn) maxn=cha[i]; 35 } 36 // printf("%d ",maxn); 37 ans+=maxn; 38 maxn=-1; 39 for(int i=1;i<n-1;i++){ 40 if(cha[i]>maxn) maxn=cha[i]; 41 } 42 // printf("%d ",maxn); 43 ans+=maxn; 44 for(int i=1;i<n-1;i++){ 45 if(loc==i){ 46 int used=-1; 47 for(int j=1;j<n;j++){ 48 if(j==i+1) continue; 49 if(j==i){ 50 if(used<abs(num[i+1]-num[i-1])) 51 used=abs(num[i+1]-num[i-1]); 52 } 53 else if(cha[j]>used) used=cha[j]; 54 } 55 ans+=used; 56 continue; 57 } 58 if(loc-1==i){ 59 int used=-1; 60 for(int j=1;j<n;j++){ 61 if(j==loc) continue; 62 if(j==loc-1){ 63 if(used<abs(num[j+1]-num[j-1])) 64 used=abs(num[j+1]-num[j-1]); 65 } 66 else if(cha[j]>used) used=cha[j]; 67 } 68 ans+=used; 69 continue; 70 } 71 if(maxc>abs(num[i+1]-num[i-1])) ans+=maxc; 72 else ans+=abs(num[i+1]-num[i-1]); 73 // printf("%I64d ",ans); 74 } 75 printf("%I64d ",ans); 76 } 77 return 0; 78 }
记录下当前位置是从开始第几大……
然后累加当前位置结尾的倒数第k大的位置……
讲道理这道题很看感觉……
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6 #include<string> 7 #include<map> 8 #include<vector> 9 #include<queue> 10 #define M(a,b) memset(a,b,sizeof(a)) 11 using namespace std; 12 int num[200005]; 13 int p[200005]; 14 int main(){ 15 int T; 16 scanf("%d",&T); 17 while(T--){ 18 int n,m,k; 19 scanf("%d%d%d",&n,&m,&k); 20 int tmp=0; 21 long long ans=0; 22 for(int i=0;i<n;i++){ 23 scanf("%d",&num[i]); 24 if(num[i]>=m){ 25 p[tmp++]=i; 26 if(tmp>=k) 27 ans+=(p[tmp-k]+1); 28 } 29 else if(i+1>=k&&tmp>=k) 30 ans+=(p[tmp-k]+1); 31 } 32 printf("%I64d ",ans); 33 } 34 return 0; 35 }