Codeforces Round #193 (Div. 2) 部分题解
A:直接判断前三项是否相等
1 int main() 2 { 3 //FIN; 4 //CHEAT; 5 int n; 6 cin>>n; 7 getchar(); 8 char a[4005]; 9 gets(a); 10 int len = strlen(a); 11 int cnt = 0; 12 for(int i = 0 ; i < len ; i++) 13 { 14 if(i % n == 0 && i != 0 ) 15 { 16 if(a[i-1] == a[i-2] && a[i-2] == a[i-3]) 17 cnt++; 18 } 19 } 20 cout<<cnt<<endl; 21 return 0; 22 }
B:
求一遍前缀和O(n).... 用前缀和求一遍所有长度为k的区间和O(n)....
再从后往前找一遍这些区间的最大值O(n)...并记下从该点到最后的区间最大值...
然后就从前向后遍历一遍,每次找从i开始的区间和从点i+k之后的最大区间 ,求一次MAX即可 O(n)
总共还是O(n)...用线段树什么的就别逗了
1 LL a[200005]; 2 LL sum[200005]; 3 LL sum1[200005]; 4 LL max2[200005]; 5 LL maxe[200005]; 6 int main() 7 { 8 //FIN; 9 //CHEAT; 10 int n,k; 11 cin>>n>>k; 12 for(int i = 1 ; i <= n ; i++) 13 { 14 cin>>a[i]; 15 sum[i] = sum[i-1] + a[i]; 16 } 17 int cnt = 1; 18 for(int i = 1 ; i <= n-k+1 ; i++) 19 { 20 sum1[cnt++] = sum[i+k-1] - sum[i-1]; 21 } 22 int back = cnt-1; 23 LL M = -INF; 24 for(int i = cnt-1 ; i >= 1 ; i--) 25 { 26 if(sum1[i] >= M) 27 { 28 max2[i] = sum1[i]; 29 maxe[i] = i; 30 M = sum1[i]; 31 }else 32 { 33 max2[i] = M; 34 maxe[i] = maxe[i+1]; 35 } 36 } 37 M = -INF; 38 int s1=0,s2=0; 39 for(int i = 1 ; i <= n ; i++) 40 { 41 if(max2[i+k] + sum1[i] > M) 42 { 43 M = max2[i+k] + sum1[i]; 44 s1 = i; 45 s2 = maxe[i+k]; 46 } 47 } 48 cout<<s1<<" "<<s2<<endl; 49 return 0; 50 }
C:
先贪心找 b最小a最大的 这是有可能取的任务
再贪心找 a最大b最大的 这是一定取的k个任务,并求出最小值
再贪心从剩下的点中 找出b小于最小值的点 ,再贪心找取p-k个b最大a最小的点...
排三遍序就行了...挺麻烦而且我感觉数据弱了...
1 struct point 2 { 3 int id ; 4 int s,v; 5 }x[MAXN],q[MAXN]; 6 int cmp(point a,point b) 7 { 8 if(a.v != b.v) 9 return a.v < b.v; 10 else return a.s > b.s; 11 } 12 int cmp1(point a,point b) 13 { 14 if(a.s != b.s) 15 return a.s > b.s; 16 else return a.v > b.v; 17 } 18 int cmp2(point a,point b) 19 { 20 if(a.v != b.v) 21 return a.v > b.v; 22 else return a.s < b.s; 23 } 24 int main() 25 { 26 //FIN; 27 //CHEAT; 28 int n,p,k; 29 cin>>n>>p>>k; 30 for(int i = 0 ; i < n ; i++) 31 { 32 cin>>x[i].s>>x[i].v; 33 x[i].id = i; 34 } 35 sort(x,x+n,cmp); 36 sort(x+(p-k),x+n,cmp1); 37 // for(int i = 0 ; i < n ; i++) 38 // cout<<x[i].s<<" "<<x[i].v<<" "<<x[i].id+1<<endl; 39 // cout<<endl; 40 int M = INF; 41 for(int i = p-k ;i < p ; i++) 42 M = min(M,x[i].v); 43 int cnt = 0 ; 44 for(int i = 0 ; i < p - k ; i++) 45 q[cnt++] = x[i]; 46 for(int i = p-1 ; i < n ; i++) 47 if(x[i].v < M ) 48 q[cnt++] = x[i]; 49 sort(q,q+cnt,cmp2); 50 51 for(int i = p-k ; i < p ; i++) 52 cout<<x[i].id+1<<" "; 53 for(int i = 0 ; i < p - k ; i++) 54 cout<<q[i].id+1<<" "; 55 cout<<endl; 56 return 0; 57 }
都是赛后做的...赛中做的话又要掉rating真是难过...今天多校也爆0...真是弱的不能多说...