(貪心 set 字符串) 2924. kotori和服裝設計

【問題描述】ios

kotori是μ's的服裝設計擔當。她有一個技能,是把一塊布料的顏色變成另外一個顏色,消耗k點魔法值。數組

已知一件衣服的奇異度取決於這件衣服顏色的種類。jsp

顏色種類爲1時,奇異度爲1。spa

顏色種類爲2時,奇異度爲3。設計

顏色種類不小於3時,奇異度爲10。code

一件衣服由不少塊布料編織而成。kotori不能增長或減小布料數量,但能夠消耗k點魔法值改變某塊布料的顏色。blog

kotori拿到了n件衣服,她想讓全部衣服奇異度的總和儘量大,但她只有m點魔法值可供消耗。她想知道,消耗這些魔法值後,全部衣服奇異度總和最大值是多少?ci

 

【輸入】字符串

第一行三個正整數n,m,k,含義見問題描述。(1<=n<=500   1<=m,k<=1e18)get

第二行有n個正整數ai,分別表明每件衣服布料的數量。(1<=ai<=500)

接下來n行,每行一個長度爲ai的、僅包含大寫字母的字符串,描述每件衣服布料的顏色。相同的字符意味着相同的顏色,不一樣字符表明不一樣的顏色。

 

【輸出】

一個正整數,表明全部衣服奇異度總和的最大值。

 

【樣例輸入】

3 5 2

4 3 5

AAAA

PDD

CRCRC

 

【樣例輸出】

21

 

【樣例描述】

只能進行2次變色。能夠這樣變色:

AAAA

PFD

TRCRC

總奇異度是1+10+10=21。

 

PS:這個是今年的校賽題,不過須要校園網才能訪問。http://acm.bistu.edu.cn/acm/submit.jsp?problemID=2924&pageNo=1&pages=0

這個是貪心題,不過,要注意變化過程當中種類數不得超過字符串的長度,好比,AA,字符串長度爲2,奇異度爲1,那隻能變化一次,不能再變化了。要注意。

根據出題人兼大佬的講解可知,先統計每一個字符串不一樣種類字母的種類數。而後優先把種類2種變成種類3種,其次把種類1種變成種類2種、再變成種類3種。

能夠創建一個二維數組 t[m][n],其中 m能夠指的是字符串的長度,m最大爲3,n能夠是奇異度,最大爲3(就是把大於等於3統一視爲3)。

C++代碼:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<set>
#include<cstring>
using namespace std;
const int maxn = 502;
int t[maxn][maxn];
int a[maxn];
typedef long long ll;
int main(){
    int n;
    ll m,k;
    cin>>n>>m>>k;
    ll g = m/k;
    for(int i = 0; i < n; i++){
        cin>>a[i];
    }
    set<char> s;
    int p,q;
    memset(t,0,sizeof(t));
    for(int i = 0; i < n; i++){
        char ch;
        s.clear();
        for(int j = 0; j < a[i]; j++){
            cin>>ch;
            s.insert(ch);
        }
        p = a[i] >= 3 ? 3 : a[i];
        q = s.size() >= 3 ? 3 : s.size();
        t[p][q]++;
    }
    if(g){
        while(t[3][2] > 0){
            t[3][2]--;
            t[3][3]++;
            g--;
            if(g == 0) break;
        }
    }
    if(g){
        while(t[3][1] > 0){
            t[3][1]--;
            t[3][2]++;
            g--;
            if(g == 0) break;
            t[3][2]--;
            t[3][3]++;
            g--;
            if(g == 0) break;
        }
    }
    if(g){
        while(t[2][1] > 0){
            t[2][1]--;
            t[2][2]++;
            g--;
            if(g == 0) break;
        }
    }
    ll sum = 0;
    for(int i = 1; i <= 3; i++){
        sum = sum + t[i][1] + t[i][2]*3 + t[i][3]*10;
    }
    printf("%lld\n",sum);
    return 0;
}
相關文章
相關標籤/搜索