首页 > 其他分享 >07_08_暑期个人赛4

07_08_暑期个人赛4

时间:2024-07-09 09:52:54浏览次数:22  
标签:07 int 08 ii ++ 个人赛 涂色 ans rep

E2. String Coloring (hard version)

时间:2024-07-09

原题:Codeforces Round 617 (Div. 3) E2. String Coloring (hard version)

题意

给一串小写字母组成的字符串,要求上色,只有颜色不同的相邻字母能换位置

不考虑交换次数,问最少涂几种颜色才能使最后的序列有序

思路

假定当前遇到的都是有序的,当遇到下一个字母,假定是无序的,就需要将无序的穿插进来

穿插途中会遇到比自己序列大的字母,那么需要与这些数的颜色不同就行

比如abcfed,abcf有序,都涂色1,遇到e时,e之前大于e的只有f,需要越过f,即颜色要不同,为2

d前有fe,需要越过两个,颜色不同,为3

代码

string s;

int arr[N];
int ans[N];
int maxmp(map<int, int>m) {
    for (int i = 0; i <= 26; i++) 
        if (!m[i])return i;
}

void solve() {
    cin >> n;
    cin >> s;
	//先将字母处理成数字
    for (int i = 0; i < n; i++) 
        arr[i] = s[i] - 'a';

    map<int, int>ans_choice[26];
    //先处理0,不过其实不用处理的。。。不过我觉得这样便于理解,写的时候没想这么多
    rep(ii, 0, 26) {ans_choice[ii][0]++;}
	//mp存储一下出现过的颜色,方便计数
    map<int, int>mp;
    for (int i = 0; i < n; i++) {
        //先获取答案
        ans[i] = maxmp(ans_choice[arr[i]]);
        mp[ans[i]]++;
        //然后将所有序列小于当前位的ans_choice中加上ans[i]
        //因为后续再出现,意味着需要越过本位,即需要与本位不同
        for (int j = 0; j < arr[i]; j++) 
            ans_choice[j][ans[i]]++;
    }

    cout << mp.size() << endl;
    for (int i = 0; i < n; i++) 
        cout << ans[i] << " ";
    
    cout << endl;
}

D. Paint the Tree

时间:2024-07-08

原题:Codeforces Round 592 (Div. 2) D. Paint the Tree

题意

给一颗树,有n个结点并且有三种颜色供选择,其中每个结点涂色的代价不同

现在要求将所有相连的三个节点涂色,保证三个节点的颜色不同

即对于u v w,u和v相连,v和w相连,三者颜色各不相同

思路

首先能确定,能成功涂色的必定是单链

然后先假定这条链是按顺序的,1->2->3...

那么涂色顺序就有两种,123或者321,当然由于开始的点不同,所以总共需要枚举6种

枚举结束,找最小答案和对应的涂色方式输出

然而,好像是前六个例子是有序的,后面是无序的,所以就需要用桶的思想

代码

int c[3][N];

int cnt[N] = { 0 };
// T[i]表示标记为i的点在链中的顺序   
int T[N];

unordered_map<int, vector<int>>mp;
//123顺序
int get1(int i) {
    int ans = 0;
    rep(jj, 0, n) {
        ans += c[i][T[jj] - 1];
        i++;
        i %= 3;
    }
    return ans;
}
//321顺序
int get2(int i) {
    int ans = 0;
    rep(jj, 0, n) {
        ans += c[i][T[jj] - 1];
        i--;
        i = (i + 3) % 3;
    }
    return ans;
}

void solve() {
    cin >> n;
    rep(ii, 0, n) { cin >> c[0][ii]; }
    rep(ii, 0, n) { cin >> c[1][ii]; }
    rep(ii, 0, n) { cin >> c[2][ii]; }

    int u, v;
    rep(ii, 0, n - 1) {
        cin >> u >> v;
        mp[u].push_back(v);
        mp[v].push_back(u);

        cnt[u]++;
        cnt[v]++;
    }

    //判断是不是一条链
    int beg = 0;
    rep(ii, 1, n + 1) {
        if (cnt[ii] == 1)beg = ii;
        if (cnt[ii] > 2) { cout << -1 << endl; return; }
    }

	//按链的顺序存桶里
    T[0] = beg;
    for (int i = 1; i < n; i++) {
        auto t = mp[T[i - 1]];
        if (i - 2 >= 0) T[i] = (t[0] != T[i - 2] ? t[0] : t[1]);
        else T[i] = t[0];
    }

    int ans1 = 1e18, ans2 = 1e18, ans3 = 1e18;
    int ansi1 = 0, ansi2 = 0, ansi3 = 0;
	//枚举答案
    rep(ii, 0, 3) {
        int t = get1(ii);
        if (t < ans1) {
            ans1 = t;
            ansi1 = ii;
        }
    }

    rep(ii, 0, 3) {
        int t = get2(ii);
        if (t < ans2) {
            ans2 = t;
            ansi2 = ii;
        }
    }
    //存数字和对应颜色,就是ans
    int p[N] = { 0 };
	
    if (ans1 < ans2) {
        cout << ans1 << endl;
        rep(ii, 0, n) {
		    //同样 根据桶来填充答案
            p[T[ii]] = ansi1 + 1;
            ansi1++;
            ansi1 %= 3;
        }
    }
    else {
        cout << ans2 << endl;
        rep(ii, 0, n) {
            p[T[ii]] = ansi2 + 1;
            ansi2--;
            ansi2 = (ansi2 + 3) % 3;
        }
    }
    rep(ii, 1, n + 1) {
        cout << p[ii] << " ";
    }
}

标签:07,int,08,ii,++,个人赛,涂色,ans,rep
From: https://www.cnblogs.com/lulaalu/p/18291151

相关文章

  • YC311A [ 20240701 CQYC省选模拟赛 T1 ] 好串(good)
    题意给定一个长度为\(n\)的\(01\)串。定义一个串是好的当且仅当该串的所有前缀以及所有后缀的\(1\)的数量大于等于\(0\)的数量。你需要维护\(q\)个查询,每次求\(S_{l,...,r}\)的子串最少添加的\(1\)的个数使得该子串是好的。Sol首先不难发现一个正确的贪心,也......
  • 跟《经济学人》学英文:2024年07月06日这期:How Starbucks caffeinates local economies
    HowStarbuckscaffeinateslocaleconomiesCallitthefrappuccinoeffectfrappuccino:星冰乐星巴克如何刺激当地经济:称之为星冰乐效应原文:Starbucksoffersendlessopportunitiesforinnovation.Partsofsocialmediadelightinhackingthechain’smenuto......
  • 代码随想录算法训联营第四天|LeetCode24. 两两交换链表中的节点 LeetCode19.删除链表
    系列文章目录代码随想录算法训练营第四天:代码随想录|LeetCode24.两两交换链表中的节点LeetCode19.删除链表的倒数第N个节点面试题02.07.链表相交LeetC142.环形链表文章目录系列文章目录前言一、LeetCode24.两两交换链表中的节点1、题目链接2、题解二、LeetCod......
  • 08.以太网交换基础+VLAN原理
    一、以太网协议介绍冲突域在共享网络(集线器hub)中,整个集线器就是一个冲突域,如果你用我也用那就信号冲突,结果全军覆没,什么数据都无法传输。为此引入了CSMA/CD机制,这样就能有效避免冲突。终端设备不停地检测共享线路的状态-->如果线路空闲,会有一个随机延迟,然后开始发送......
  • 20240706总结(线段树应用)
    A-PhysicalEducationLessonsCF915EPhysicalEducationLessons题解:没什么好说的,动态开点模板题(好像普通线段树也可以做)B-GCDofanArrayCF1493DGCDofanArray题解:暴力分解质因数,修改的时候也把x分解,对每个质数开一个可重集合(multiset)记录一下每个质数出现的不同位......
  • 统信UOS-1070A安装k8s
     系统版本[root@localhost~]#cat/etc/os-version[Version]SystemName=UOSServerSystemName[zh_CN]=统信服务器操作系统ProductType=ServerProductType[zh_CN]=服务器EditionName=eEditionName[zh_CN]=eMajorVersion=20MinorVersion=1070OsBuild=12038.100.100......
  • 小抄 20240705
    1多观察,少评判。评判,就是用自己的主观观点在评价一个自己不了解的东西,一定会有偏见。观察,要抛开自己那些先入为主的观念,观察自己的想法,也观察眼前事物的变化,不评判,才能客观。2写作,更像是自己收集了一个问题,然后再自己解答出来。而且最关键的不是答案,而是能够准确描述问......
  • springboot个人健康信息管理小程序-计算机毕业设计源码07695
    摘要在当今这个数字化、信息化的时代,个人健康管理已成为人们生活中不可或缺的一部分。随着生活节奏的加快,越来越多的人开始关注自己的身体状况,希望能够及时了解并调整自己的生活习惯,以达到最佳的健康状态。为此,我们开发了一款基于SpringBoot的个人健康信息管理小程序,旨在......
  • 07_07_暑期个人赛3
    A.Row时间:2024-07-08原题:CodeforcesRound484(Div.2)A.Row题意给一串字符串有01组成,1边上不能有1,0边上不能没有1,如果满足输出yes思路就,一个一个遍历过来,写这题主要因为需要看清题目,注意如果只有一个“0”需要输出no,因为没有1A.AliceandBob时间:2024-07-08原题:Cod......
  • 【2024-07-06】连岳摘抄
    23:59梅雨霁,暑风和。高柳乱蝉多。小园台榭远池波。鱼戏动新荷。薄纱厨,轻羽扇。枕冷簟凉深院。此时情绪此时天。无事小神仙。                                               ......