CF-1114 (2019/02/11)

CF-1114

A. Got Any Grapes?

skip

B. Yet Another Array Partitioning Task

  • 将n个数分成连续的k组,使得每组的前m大的数字的总和最大。
  • 首先可以想到肯定可以包含n个数中前 m*k 大的数。所以可以先将他们标记,然后扫一遍确定每组的端点即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,k;
struct node{
    int x;
    int id;
}a[200010];
int v[200010];
bool cmp(node a,node b){
    return a.x>b.x;
}
int main(){
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i].x);
        a[i].id = i;
    }
    sort(a+1,a+n+1,cmp);
    ll sum = 0;
    for(int i=1;i<=m*k;i++){
        v[a[i].id] = 1;
        sum += a[i].x;
    }
    vector<int> ans;
    int num = 0;
    for(int i=1;i<=n;i++){
        if(v[i])num++;
        if(num==m){
            ans.push_back(i);num=0;
            if(ans.size()==k-1)
                break;
        }
    }
    cout<<sum<<endl;
    for(int i=0;i<k-1;i++)
        cout<<ans[i]<<' ';
    puts("");
    return 0;
}

C. Trailing Loves (or L‘oeufs?)

  • $ n! = p_1^{x_1} \cdot p_2^{x_2}\cdots p_m^{x_m} \cdot Q$
  • \(b = p_1^{y_1} \cdot p_2^{y_2} \cdots p_m^{y_m}\)

分解n!的质因数复杂度为 O(log N)。所以我们可以将b分解质因数,对于质因数\(p_i\),计算n!含有多少个质因子\(p_i\) (设\(x_i\)) ,则该质因子下答案为 \(\lfloor x_i/y_i \rfloor\) , 最终\(ans = min \{ \lfloor x_1/y_1 \rfloor \cdots \lfloor x_m/y_m\rfloor \}\)

  • 计算n!中含有多少个\(p_i\) 时,可以这样计算:

    • 首先在1到n的排列中肯定有\(\lfloor n/p_i \rfloor\)个包含质因子\(p_i\)的数,同理也有\(\lfloor x/{p_i^2}\rfloor\) 个含有两个\(p_i\)的数,不过其中的一个质因子已经在\(\lfloor n/p_i \rfloor\)中统计过,所以只需要再统计第二个质因子,即累加上\(\lfloor x/{p_i^2}\rfloor\),而不是\(2*\lfloor x/{p_i^2}\rfloor\)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = LONG_LONG_MAX;
ll n,b;
ll calc(ll p,ll cnt){
    //res为上述xi
    ll res = 0,base = 1;
    for(;base<=n/p;){
        base*=p;
        res += n/base;
    }
    /*写成下面这样会爆
    for(base=x;base<=n;base*=x){
        res += n/base;
    }*/
    return res/cnt;
}
int main(){
    cin>>n>>b;
    ll ans = inf;
    //分解质因数
    for(ll i=2;i*i<=b;i++){
        if(b%i==0){
            ll cnt = 0;//cnt为上述yi
            while(b%i==0)b/=i,cnt++;
            ans = min(ans,calc(i,cnt));
        }
    }
    if(b>1) ans = min(ans,calc(b,1));
    cout<<ans<<endl;
}

D. Flood Fill

  • (又是一个没见过的区间DP,题解里面说可以倒过来LCS,相当于求最长回文子序列,不过我还没搞懂
  • d[i][j][0]表示区间[i,j]所有数字与a[i]相同时所需要的最少改变次数,d[i][j][1]表示与a[j]相同。复杂度为\(O(n^2)\)
  • 每次转移只能向左或者向右移动一格,细节看代码吧
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int n;
int a[5050];
int dp[5050][5050][2];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    if(n==1){
        puts("0");return 0;
    }
    memset(dp,0x3f,sizeof dp);
    for(int i=1;i<=n;i++)dp[i][i][0] = dp[i][i][1] = 0;
    for(int i=n;i>=1;i--){
        for(int j=i;j<=n;j++){
            for(int k=0;k<2;k++){
                //c为标准
                int c = k==0?a[i]:a[j];
                if(j<n)
                    dp[i][j+1][1] = min(dp[i][j+1][1],dp[i][j][k]+(a[j+1]==c?0:1));
                if(i>1)
                    dp[i-1][j][0] = min(dp[i-1][j][0],dp[i][j][k]+(a[i-1]==c?0:1));
            }
        }
    }
    cout<<min(dp[1][n][0],dp[1][n][1])<<endl;
}

原文地址:https://www.cnblogs.com/1625--H/p/10362932.html

时间: 2024-08-02 22:44:33

CF-1114 (2019/02/11)的相关文章

【谜客帝国】第147届月思主擂谜会(2019.02.15)

 [谜客帝国]第147届月思主擂谜会(2019.02.15) 主持计分:东东 1.“人在中天日月间”(9笔字)春/月思 [注:面出陈孚<开平即事二首>,“势超大地山河上,-.”] 2. 玉漏声中烟气袅(3字法国奢侈品牌)YSL/月思 3. 双双相念初相爱(2字著名动漫人物)菜菜/月思 4.“数点燕云州外.雪霜威”(足球用语二,4+3)4132.451/月思 [注:面出余文<相见欢>,“登高望断龙旗,未曾归.几度中原北定,梦依稀.朔风乱,胡尘漫,掩斜晖.-.”] 5.“十载同心如一人

2019.09.11学习整理

2019.09.11学习整理 进程基础 什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)

周记 - 2019年11月03日

2019年11月05日 2019年徐州区域赛结束了.封榜前3题铜牌前部,封榜后最后27分钟罚了4次通过E题.虽然4题罚时爆炸,不过万幸得了银牌后部.目前看应该还会再参加一年的,这个博客会不断更新记录最后一年参加比赛的学习进度(以及最后两年本科的其他事情),今年的目标是做一个真正的全能选手,首先希望在寒假结束前把Codeforces打到橙色(2100+),证明自己思维还行吧. 既然想做全能选手,每个专题都要学到省选级别吧,学习的分类就参照OI-Wiki的分类,题单的话,模板题从洛谷找,思维题从Co

一周极客分享2019年11月-第1周

一周极客分享2019年11月-第1周 本周极客分享周刊语录: 世界正在迅速电气化,轿车.卡车.摩托车.飞机都在变成电动设备.原因大致相同:运行更安静,维护需求减少,性能和效率更高,能源使用更加灵活. 职场人生 作为一名程序员,你真正了解CDN技术吗?真正的成熟,是明白世界上99%的事情,都不重要Java面试官:给Java面试者的八点建议2019最新BAT.TMD等等公司技术面试题及其答案 运维架构 用 Jenkins 构建 CI\/CD 流水线 | Linux 中国在 Linux 上用 stra

【誉天】2019年11月HCIE-R&S学员LAB认证考试成绩单合集

誉天2019年11月HCIE&RS学员LAB认证考试成绩单合集 出炉啦! 祝贺这些学员,并希望这些学员在接下来的面试考试中发挥同样优异的表现! HCIE证书正在向大家招手~ 电话:4008-868-010 QQ:1424150046 微信:誉天教育(yutianeduzs) [誉天]2019年11月HCIE-R&S学员LAB认证考试成绩单合集 原文地址:https://blog.51cto.com/13561944/2456441

tmux使用——2019年11月20日16:40:15

1.tmux 命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称"窗口"),在里面输入命令.用户与计算机的这种临时的交互,称为一次"会话"(session) . 会话的一个重要特点是,窗口与其中启动的进程是连在一起的.打开窗口,会话开始:关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完. 一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令.这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的

抑郁症:2019年11月19日

重度抑郁症确诊第1天,坚持记录第1天 早上 在学校上课,和班主任请假下午去医院检查,没告诉班主任检查什么. 下午 Chicago_01 2019/11/09 14:01:32 14:01 到家了,准备去医院 Chicago_01 2019/11/09 14:01:38 Chicago_01 2019/11/09 14:20:36 14:20 到医院了 Chicago_01 2019/11/09 14:21:05 Chicago_01 2019/11/09 14:53:06 14:52 换一个医院

CF 1114 E. Arithmetic Progression

E. Arithmetic Progression 链接 题意: 交互题. 有一个等差序列,现已打乱顺序,最多询问60次来确定首项和公差.每次可以询问是否有严格大于x的数,和查看一个位置的数. 分析: 首先可以二分找到序列的最大值,然后考虑如何求公差. 随机选30个数,然后对任意两个求一遍gcd即可. 正确性证明 代码: #include<cstdio> #include<algorithm> #include<cstring> #include<iostream

PAT 甲级 A1009 (2019/02/01)

1 #include<cstdio> 2 struct Poly{ 3 int exp; //次数 4 double coe; //系数 5 }A[1001]; 6 double Product[2001]; 7 int main(){ 8 int n1, n2, count = 0; 9 scanf("%d",&n1); 10 for(int i = 0; i < n1; i++){ 11 scanf("%d %lf", &A[i