hdu 5583(贪心)

来源:互联网 发布:算法公倍数怎么求 编辑:程序博客网 时间:2024/06/09 16:15

分析:算出每一段的个数,贪心过去,注意段数为1的情况 和 段的元素和为1的情况

#include <cstdio>#include <bits/stdc++.h>#include <iostream>using namespace std;typedef long long int LL;#define maxn 100050int T , n ;char a[maxn];LL sum[maxn];int scnt;LL s[maxn];LL ans;LL cal(int x,int y ,int z){    if( y == 1 )return (x+y+z)*(x+y+z);    return (x+1)*(x+1) + (y-1)*(y-1) + z*z;}LL cal2(int x,int y ,int z){    if( y == 1 )return (x+y+z)*(x+y+z);    return x*x + (y-1)*(y-1) + (z+1*z+1);}void deal(){    for(int i = 1 ; i < scnt ; ++i)    {        if( i + 2 <= scnt ){             ans = max( ans , cal2( sum[i] , sum[i+1] , sum[i+2] )  + s[scnt] - s[i+2]  + s[i-1] );             ans = max( ans , cal( sum[i] , sum[i+1] , sum[i+2] )  + s[scnt] - s[i+2]  + s[i-1] );        }        else {           ans = max( ans , cal2( 0 , sum[i] , sum[i+1] ) + s[scnt] - s[i+1] + s[i-1] );           ans = max( ans , cal( sum[i] , sum[i+1] , 0 ) + s[scnt] - s[i+1] + s[i-1] );        }    }}int main(){    cin >> T;    int cas = 0;    while(T--){        scnt = 0;        int x  = -1, cnt = 1;        scanf("%s",a);        int len = strlen(a);        for(int i = 0 ; i < len ; ){           int temp = a[i];           int cnt = 0;           while( a[i] == temp && i < len ){               i++;               cnt++;           }           sum[++scnt] = cnt;        }        printf("Case #%d: ",++cas);        if( scnt ==  1 ){            cout << sum[1]*sum[1] << endl;            continue;        }        for(int i = 1 ; i <= scnt ; ++i)            s[i] = s[i-1] + sum[i]*sum[i];        ans = s[scnt];        deal();        cout << ans << endl;    }}


原创粉丝点击