84692024-01-17 07:52:49zoliFestés (50 pont)cpp17Wrong answer 24/50356ms23916 KiB
#include <iostream>
#include<climits>
using namespace std;
int N,M;
int r[5]; ///sorok ajanlata
int c[100001][5][5]; /// c[j][x][y] => j. oszlop ajanlata x, y kozott
void be()
{
    cin>>N>>M;
    for(int i=1;i<=N;i++) cin>>r[i];
    for(int j=1;j<=M;j++)
        for(int x=1;x<=N;x++)
            for(int y=x;y<=N;y++) cin>>c[j][x][y];
}
void megold()
{
    long long sum;
    long long mini=0;
    /// ha minden sor festve van
    for(int i=1;i<=N;i++) mini+=r[i];

    if(N==2) ///csak 2 sor van
    {
        /// nincs sor festve
        sum=0;
        for(int j=1;j<=M;j++)
        {
             sum+=min(c[j][1][1]+c[j][2][2],c[j][1][2]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R1 sor festve van
        sum=r[1];
        for(int j=1;j<=M;j++)
        {
             sum+=min(c[j][2][2],c[j][1][2]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R2 sor festve van
        sum=r[2];
        for(int j=1;j<=M;j++)
        {
             sum+=min(c[j][1][1],c[j][1][2]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

    }
    else if(N==3) /// 3 sor van
    {
        /// nincs sor festve
        sum=0;
        for(int j=1;j<=M;j++)
        {
             sum+=min(min(min(c[j][1][1]+c[j][2][2]+c[j][3][3],c[j][1][1]+c[j][2][3]),c[j][1][2]+c[j][3][3]),c[j][1][3]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R1 sor festve van
        sum=r[1];
        for(int j=1;j<=M;j++)
        {
             sum+=min(min(min(c[j][2][2]+c[j][3][3],c[j][2][3]),c[j][1][2]+c[j][3][3]),c[j][1][3]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R2 sor festve van
        sum=r[2];
        for(int j=1;j<=M;j++)
        {
             sum+=min(min(min(c[j][1][1]+c[j][3][3],c[j][1][1]+c[j][2][3]),c[j][1][2]+c[j][3][3]),c[j][1][3]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R3 sor festve van
        sum=r[3];
        for(int j=1;j<=M;j++)
        {
             sum+=min(min(min(c[j][1][1]+c[j][2][2],c[j][1][2]),c[j][1][1]+c[j][2][3]),c[j][1][3]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R1 es R2 festve van, R3 nincs
        sum=r[1]+r[2];
        for(int j=1;j<=M;j++)
        {
             sum+=min(min(c[j][3][3],c[j][2][3]),c[j][1][3]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R1 es R3 festve van, R2 nincs
        sum=r[1]+r[3];
        for(int j=1;j<=M;j++)
        {
             sum+=min(min(min(c[j][2][2],c[j][2][3]),c[j][1][2]),c[j][1][3]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R2 es R3 festve van, R1 nincs
        sum=r[2]+r[3];
        for(int j=1;j<=M;j++)
        {
             sum+=min(min(c[j][1][1],c[j][1][2]),c[j][1][3]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig
    }
    else /// N==4 sor van
    {
        /// nincs sor festve
        sum=0;
        for(int j=1;j<=M;j++)
        {
             sum+=min(min(min(min(min(min(min(c[j][1][1]+c[j][2][2]+c[j][3][3]+c[j][4][4],c[j][1][4]),
                c[j][1][2]+c[j][3][3]+c[j][4][4]),c[j][1][1]+c[j][2][3]+c[j][4][4]),c[j][1][1]+c[j][2][2]+c[j][3][4]),
                c[j][1][2]+c[j][3][4]), c[j][1][3]+c[j][4][4]), c[j][1][1]+c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R1 sor festve van
        sum=r[1];
        for(int j=1;j<=M;j++)
        {
             sum+=min(min(min(min(min(min(min(c[j][2][2]+c[j][3][3]+c[j][4][4],c[j][1][4]),
                c[j][1][2]+c[j][3][3]+c[j][4][4]),c[j][2][3]+c[j][4][4]),c[j][2][2]+c[j][3][4]),
                c[j][1][2]+c[j][3][4]), c[j][1][3]+c[j][4][4]), c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R2 sor festve van
        sum=r[2];
        for(int j=1;j<=M;j++)
        {
             sum+=min(min(min(min(min(min(min(c[j][1][1]+c[j][3][3]+c[j][4][4],c[j][1][4]),
                c[j][1][2]+c[j][3][3]+c[j][4][4]),c[j][1][1]+c[j][2][3]+c[j][4][4]),c[j][1][1]+c[j][3][4]),
                c[j][1][2]+c[j][3][4]), c[j][1][3]+c[j][4][4]), c[j][1][1]+c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R3 sor festve van
        sum=r[3];
        for(int j=1;j<=M;j++)
        {
             sum+=min(min(min(min(min(min(min(c[j][1][1]+c[j][2][2]+c[j][4][4],c[j][1][4]),
                c[j][1][2]+c[j][4][4]),c[j][1][1]+c[j][2][3]+c[j][4][4]),c[j][1][1]+c[j][2][2]+c[j][3][4]),
                c[j][1][2]+c[j][3][4]), c[j][1][3]+c[j][4][4]), c[j][1][1]+c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R4 sor festve van
        sum=r[4];
        for(int j=1;j<=M;j++)
        {
              sum+=min(min(min(min(min(min(min(c[j][1][1]+c[j][2][2]+c[j][3][3],c[j][1][4]),
                c[j][1][2]+c[j][3][3]),c[j][1][1]+c[j][2][3]),c[j][1][1]+c[j][2][2]+c[j][3][4]),
                c[j][1][2]+c[j][3][4]), c[j][1][3]), c[j][1][1]+c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R1+R2 sor festve van
        sum=r[1]+r[2];
        for(int j=1;j<=M;j++)
        {
               sum+=min(min(min(min(min(c[j][3][3]+c[j][4][4],c[j][1][4]),
                c[j][2][3]+c[j][4][4]),c[j][3][4]),
                 c[j][1][3]+c[j][4][4]), c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R1+R3 sor festve van
        sum=r[1]+r[3];
        for(int j=1;j<=M;j++)
        {
               sum+=min(min(min(min(min(min(min(c[j][2][2]+c[j][4][4],c[j][1][4]),
                c[j][1][2]+c[j][4][4]),c[j][2][3]+c[j][4][4]),c[j][2][2]+c[j][3][4]),
                c[j][1][2]+c[j][3][4]), c[j][1][3]+c[j][4][4]), c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R1+R4 sor festve van
        sum=r[1]+r[4];
        for(int j=1;j<=M;j++)
        {
               sum+=min(min(min(min(min(min(min(c[j][2][2]+c[j][3][3],c[j][1][4]),
                c[j][1][2]+c[j][3][3]),c[j][2][3]),c[j][2][2]+c[j][3][4]),
                c[j][1][2]+c[j][3][4]), c[j][1][3]), c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R2+R3 sor festve van
        sum=r[2]+r[3];
        for(int j=1;j<=M;j++)
        {
               sum+=min(min(min(min(min(min(c[j][1][1]+c[j][4][4],c[j][1][4]),
                c[j][1][2]+c[j][4][4]),c[j][1][1]+c[j][3][4]),
                c[j][1][2]+c[j][3][4]), c[j][1][3]+c[j][4][4]), c[j][1][1]+c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R2+R4 sor festve van
        sum=r[2]+r[4];
        for(int j=1;j<=M;j++)
        {
               sum+=min(min(min(min(min(min(min(c[j][1][1]+c[j][3][3],c[j][1][4]),
                c[j][1][2]+c[j][3][3]),c[j][1][1]+c[j][2][3]),c[j][1][1]+c[j][3][4]),
                c[j][1][2]+c[j][3][4]), c[j][1][3]), c[j][1][1]+c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig


        /// R3+R4 sor festve van
        sum=r[3]+r[4];
        for(int j=1;j<=M;j++)
        {
               sum+=min(min(min(min(min(c[j][1][1]+c[j][2][2],c[j][1][4]),
                c[j][1][2]),c[j][1][1]+c[j][2][3]),
                 c[j][1][3]), c[j][1][1]+c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig


        /// R1+R2+R3 sor festve van
        sum=r[1]+r[2]+r[3];
        for(int j=1;j<=M;j++)
        {
               sum+=min(min(min(c[j][4][4],c[j][1][4]),
                c[j][3][4]),
                c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R1+R2+R4 sor festve van
        sum=r[1]+r[2]+r[4];
        for(int j=1;j<=M;j++)
        {
               sum+=min(min(min(min(min(c[j][3][3],c[j][1][4]),
                c[j][2][3]),c[j][3][4]),
                 c[j][1][3]),c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R1+R3+R4 sor festve van
        sum=r[1]+r[3]+r[4];
        for(int j=1;j<=M;j++)
        {
               sum+=min(min(min(min(min(c[j][2][2],c[j][1][4]),
                c[j][1][2]),c[j][2][3]),
                 c[j][1][3]), c[j][2][4]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig

        /// R2+R3+R4 sor festve van
        sum=r[2]+r[3]+r[4];
        for(int j=1;j<=M;j++)
        {
               sum+=min(min(min(c[j][1][1],c[j][1][4]),
                c[j][1][2]),
                 c[j][1][3]);
             if(sum>mini) break; /// ha menet kozben tobbe kerulne, mint az eddigi legolcsobb lehetoseg
        }
        if(sum<mini) mini=sum; /// ez festesi mod az olcsobb eddig
    }
    cout<<mini;
}
int main()
{
    be();
    megold();
    return 0;
}
SubtaskSumTestVerdictTimeMemory
base24/50
1Accepted0/03ms1888 KiB
2Wrong answer0/03ms2112 KiB
3Accepted2/2218ms21904 KiB
4Wrong answer0/23ms2512 KiB
5Accepted3/34ms2932 KiB
6Wrong answer0/228ms4668 KiB
7Accepted2/2303ms22284 KiB
8Wrong answer0/2301ms22284 KiB
9Wrong answer0/2301ms22292 KiB
10Accepted2/2305ms22236 KiB
11Wrong answer0/2305ms22388 KiB
12Wrong answer0/2280ms20952 KiB
13Wrong answer0/2303ms20992 KiB
14Accepted2/2104ms22732 KiB
15Accepted3/3108ms22956 KiB
16Accepted3/3184ms23044 KiB
17Accepted2/2184ms22988 KiB
18Accepted3/3181ms22880 KiB
19Accepted2/2254ms21008 KiB
20Wrong answer0/2279ms22048 KiB
21Wrong answer0/2298ms22932 KiB
22Wrong answer0/2298ms23276 KiB
23Wrong answer0/2300ms23484 KiB
24Wrong answer0/2289ms23700 KiB
25Wrong answer0/2356ms23916 KiB