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...真是弱的不能多说...

转载于:https://www.cnblogs.com/Felix-F/p/3216191.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值