Alternative Accounts 贪心匹配

Alternative Accounts 贪心匹配

题意:

有n个账号,k场比赛(1 <= k <= 3),每场比赛有m个人参加,账号名分别为\(x_i\),一个人可以有多个账号,但是一个人只能用一个账号参加比赛,问最少有多少个人。

题解:

(大佬教我的)同一场比赛的账号不能在同一个集合里,问最少用几个集合能把数装满,用cnt1,cnt2,cnt3分别记录只出现在第一,二,三场比赛的账号,用cnt12,cnt13,cnt23记录出现在第一二,一三,二三场比赛的账号,那么cnt1和cnt23可以放到同一个集合里,如果cnt1还没放满,可以放cnt2和cnt3的(具体还是看代码

#include <cstdio>
#include <algorithm>
using std::max;
using std::min;

int n, t, m[5], a[5][100010], ans = 0, cnt[100010], c[5][100010];//ans是答案
int main() {
    int  cnt1 = 0, cnt2 = 0, cnt3 = 0;
    int cnt12 = 0, cnt13 = 0, cnt23 = 0;
    scanf("%d %d", &n, &t);
    for(int i = 1; i <= t; i++) {
        scanf("%d", &m[i]);
        for(int j = 1; j <= m[i]; j++) {
            scanf("%d", &a[i][j]);
            cnt[a[i][j]]++;//记录总出现次数
            c[i][a[i][j]]++;//记录在第几场出现
        }
    }
    if(t == 1) ans = m[1];
    if(t == 2) {
        for(int i = 1; i <= n; i++) {
            if(cnt[i] == 1) {
                if(c[1][i] == 1) cnt1++;
                else cnt2++;
            }
            else if(cnt[i] == 2) ans++;
        }
        ans += max(cnt1, cnt2);
    }
    if(t == 3) {
        for(int i = 1; i <= n; i++) {
            if(cnt[i] == 1) {
                if(c[1][i] == 1) cnt1++;
                else if(c[2][i] == 1) cnt2++;
                else cnt3++;
            }
            else if(cnt[i] == 2) {
                if(c[1][i] == 1 && c[2][i] == 1) cnt12++;
                else if(c[1][i] == 1 && c[3][i] == 1) cnt13++;
                else if(c[2][i] == 1 && c[3][i] == 1) cnt23++;
            }
            else if(cnt[i] == 3) ans++;
        }
        int sum1 = cnt1 + cnt12 + cnt13 + max(0, cnt3 - max(0, cnt1 - cnt23) - cnt12) + max(0, cnt2 - max(0, cnt1 - cnt23) - cnt13) + max(0, cnt23 - cnt1);
        int sum2 = cnt2 + cnt12 + cnt23 + max(0, cnt3 - max(0, cnt2 - cnt13) - cnt12) + max(0, cnt1 - max(0, cnt2 - cnt13) - cnt23) + max(0, cnt13 - cnt2);
        int sum3 = cnt3 + cnt13 + cnt23 + max(0, cnt1 - max(0, cnt3 - cnt12) - cnt23) + max(0, cnt2 - max(0, cnt3 - cnt12) - cnt13) + max(0, cnt12 - cnt3);
        ans += min(sum1, min(sum2, sum3));
    }
    printf("%d\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/fanshhh/p/12246835.html

时间: 2024-10-07 13:05:46

Alternative Accounts 贪心匹配的相关文章

Python 正则表达式 贪心匹配和非贪心匹配

Python的正则表达式默认是"贪心匹配",即在有第二义的情况下,尽可能匹配最长的字符串,在正则表达式的花括号后面跟上问号,可以变为非贪心模式 >>> >>> haRegex=re.compile(r'(ha){3,5}')>>> m=haRegex.search('hahahahahaha')>>> print(m.group())hahahahaha>>> 上述输出5个ha,是贪心匹配 >

CF 604C Alternative Thinking#贪心

(- ̄▽ ̄)-* #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN=100005; char s[MAXN]; int main() { int n; scanf("%d",&n); scanf("%s",s);//输入01串 int origin=1,flip=0; for(int i=1;i

Bzoj1237 [SCOI2008]配对

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1446  Solved: 551 Description 你有n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一 个Bp[i].要求所有配对的整数差的绝对值之和尽量小,但不允许两个相同的数配 对.例如A={5,6,8},B={5,7,8},则最优配对方案是5配8, 6配5, 8配7,配对整数 的差的绝对值分别为2, 2, 1,和为5.注意,5配5,6配7,8配8是不允许的,因 为

python 爬图片

学了两天python,语法慢慢熟悉吧,数据结构都没写过. 写了一个爬图片的小东西.挺有意思的.都是女神照 (????) 用的是正则表达式, 1 ''' 2 符号: 3 . 匹配任意字符,\n除外 4 * 匹配前一个字符一次或无限次 5 ? 匹配前一个字符0次或1次 6 .* 贪心匹配 7 .*? 非贪心匹配 8 () 返回括号内容 9 方法: 10 findall 11 search 12 sub 13 14 用的最多的是(.*?) 15 ''' requests的导入,我也是醉了,还要easy

javascript的正则表达式学习

关于反向引用 复制代码 代码如下: // 测试函数 function matchReg(reg, str) { var result = str.match(reg); if(result) { console.dir(result); } else { console.log('match failed'); } } var reg = /([A-Za-z]{0,6})\1/; var str = 'AndrewAndrew'; // 测试通过 matchReg(reg, str); //通过

HDU4757 Tree(可持久化Trie)

写过可持久化线段树,但是从来没写过可持久化的Trie,今天补一补. 题目就是典型的给你一个数x,和一个数集,问x和里面的某个数xor起来的最大值是多少. 最原始的是数集是固定的,只需要对数集按照高到低位去建Trie,然后贪心匹配就可以了. 这里则是对树上路径的操作,其实也是一样的,对每个节点x维护root到x的Trie,然后纪录下往左走往右走的叶子节点个数,设z=lca(x,y),那么到了个某个节点能否往某个儿子走的限制条件是 sz[ch[x][c]]+sz[ch[y][c]]-2*sz[ch[

诸葛亮

/** 坦克大战(TankCraft) AI程序* 颜世光* 2010.05.21*/#define _CRT_SECURE_NO_DEPRECATE #include "Tank.h"#include <string.h> //请勿修改以上头文件#include <iostream>#include <algorithm>#include <limits>#include <queue>#include <map>

javascript基础---正则表达式和字符串,数组

一.正则表达式 1.正则表达式的创建方法 var re=/abc/; var re=new RegExp("abc") var re=new RegExp(/abc/); 2.正则表达式语法 2.1简单语法 c表示一个或者多个普通字符 {n}:表示匹配的次数 {n,}:表示匹配的次数>=n {n,m}:表示匹配的次数>n,<m \:表示转义的次数 ^:表示匹配输入的字符串的开始位置(在被匹配的字符串的开始部分 来匹配) $:表示匹配输入字符串的结束位置(在被匹配的字符

Python基础知识【一】

第一部分: 简易/中等  什么是Python装饰器,如何使用? 你会如何??设置很多项目,其中每一个使用Python的不同版本和第三方库? 什么是PEP8和你是如何遵循它的规范? 参数是如何传递的 - 传值还是传引用? (容易,但又不那么容易,不确定是否能清楚地回答这个问题) 什么是列表解析.字典解析?举个例子 请用三种不同的方法完成"提取列表中每三个项目"? 你知道列表和元组之间的区别么?举个例子? 你知道range和xrange之间的区别?     针对python2.x版本 谈谈