当前位置: 首页 > news >正文

CF每日一练(2.8)

CF-1110

A. Parity

  • 快速幂的思想,考虑最后一位即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll b,k;
ll a[100010];
int main(){
    scanf("%lld%lld",&b,&k);
    for(int i=0;i<k;i++)
        scanf("%lld",&a[i]);
    ll ans = 0;
    ll base = 1;
    for(int i=0;i<k;i++){
        ans = (ans+a[k-i-1]*base)%10;
        base = base*b%10;
    }
    if(ans%2)puts("odd");
    else puts("even");
    return 0;
}

可以再多想一想。

\[n = a_1\cdot b^{k-1} + a_2\cdot b^{k-2} + \cdots + a_{k-1} \cdot b + a_k\]

  • b为偶数时,n的奇偶性只与\(a_k\) 有关
  • b为奇数时,\(b^k\) 为奇数,所有n的奇偶性只与 a 序列中奇数个数有关。
#include<bits/stdc++.h>
using namespace std;
int b,k,i,x,y;
int main(){
    for(cin>>b>>k;i<k;i++)
        cin>>x,y+=x%2;
    cout<<((b%2?y%2:x%2)?"odd":"even");
}

B. Tape

n == k 时直接输出 n 就好

n <= k 时,一些点要合并,由于合并产生的操作可能会使一段上面有多个点,所以我们要先把 k 个点都用长度为 1 的去填好。之后合并的时候只需要考虑点与点之间的距离即可(YY一下,你就知道)

  • 当 k 等于 n,则直接输出 n
  • 当 k 小于 n,则先把k段用长度为1补齐,再加上 (n-k) 段比较小的距离。
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
int a[100010];
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(int i=n-1;i>0;i--)
        a[i] = a[i]-a[i-1];
    sort(a+1,a+n);
    int ans = k;
    for(int i=1;i<=(n-k);i++)
        ans += a[i];
    cout<<ans<<endl;
    return 0;
}

C. Meaningless Operations

根据 Note 可以得知只要凑出一个 0 ,就可能得到最大的gcd。

  • \(a\neq (2^x -1)\) , 则一定可以找到一个 b 使得

    • $ a \oplus b = 2^x -1$ ,\(a \& b = 0\)
  • \(a = (2^x - 1)\) ,则可以发现

    \(gcd( a\oplus b, a\&b) = gcd(2^x-1-b,b) = gcd(2^x-1,b)\)

    • 因为 \(gcd(x,x+y) = gcd(x,y)\)
    • 所以只需要找到 a 的最大因数(非a) 即可。
  • 复杂度\(O(q\sqrt m)\) 。但是可以打表做(也可以直接暴力求)

#include <bits/stdc++.h>
using namespace std;
int po[30];
int res[30] = {0,1,1,1,5,1,21,1,85,73,341,89,1365,1,5461,4681,21845,1,87381,1,349525,299593,1398101,178481,5592405,1082401,22369621};
void init(){
    po[0] = 1;
    for(int i=1;i<30;i++)
        po[i] = po[i-1]*2;
}
bool check(int x){
    for(int i=1;i<30;i++)
        if(x==po[i]-1)
            return true;
    return false;
}
int calc(int x){
    int num =0;
    while(x)
    {
        x/=2;
        num++;
    }
    return num;
}
int main(){
    init();
    int q;
    cin>>q;
    while(q--){
        int n;
        cin>>n;
        if(check(n)){
            int num = calc(n);
            cout<<res[num]<<endl;
        }
        else{
            for(int i=1;i<30;i++){
                if(n>=po[i]&&n<po[i+1]){
                    cout<<po[i+1]-1<<endl;
                    break;
                }
            }
        }
    }
}

D. Jongmah

  • (好难的dp,其实早在 HDU-6188 就出现过了

  • 首先这个题或许可以贪心,但是目前没找到正确的贪心策略(几乎都是dp

    首先考虑什么状态(我不是自己想到的,但是知道这样做之后慢慢琢磨确实应该这么做

    状态需要转移,那么我们需要保留那些结果?

  • d[i][j][k]j 个 [i-1,i,i+1]k 个 [i,i+1,i+2] 时的最大组合数

  • 转移:d[i+1][k][l] = max( d[i+1][k][l], d[i][j][k] + l + (a[i+1]-j-k-l)/3) )

  • 答案为d[m+1][0][0] ,(总长度为m)

#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[1000100];
int d[1000100][3][3];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0,x;i<n;i++){
        scanf("%d",&x);
        a[x]++;
    }
    int ans = 0;
    d[0][0][0] = 0;
    for(int i=0;i<=m;i++)
        for(int j=0;j<3;j++)
            for(int k=0;k<3;k++)
                for(int l=0;l<3&&l+k+j<=a[i+1];l++)
                    d[i+1][k][l] = max(d[i+1][k][l],d[i][j][k]+l+(a[i+1]-j-k-l)/3);
    cout<<d[m+1][0][0]<<endl;
    return 0;
}

E. Magic Stones

考虑差分:\(d_i = c_{i+1} - c_i\)

交换前后:$ c_j -> c_j^{’} = c_{j+1} + c_{j-1} - c_j$

  • \(d_{j-1}^{'} = c_j^{'} -c_{j-1} = c_{j+1} + c_{j-1} - c{j} - c_{j-1} = c_{j+1}-c_j = d_j\)
  • \(d_j^{'} = c_{j+1}-c_j^{'} = c_{j+1} - (c_{j+1} + c_{j-1} -c_j) = c_j - c_{j-1} = d_{j-1}\)

只需比较 c 和 d 的差分序列是否相同即可。等等,你还需要注意一点,头和尾是不能变化的

#include <bits/stdc++.h>
using namespace std;
int n;
int c[100010],d[100010];
multiset<int> s1,s2;
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&c[i]);
        if(i)s1.insert(c[i]-c[i-1]);
    }
    for(int i=0;i<n;i++){
        scanf("%d",&d[i]);
        if(i)s2.insert(d[i]-d[i-1]);
    }
    if(c[0]!=d[0]||c[n-1]!=d[n-1])puts("No");
    else if(s1==s2)puts("Yes");
    else puts("No");
    return 0;
}

转载于:https://www.cnblogs.com/chd-acm/p/10356285.html

相关文章:

  • 研究人员发现 macOS 可获取用户密码的 0day 漏洞
  • vue3.0 记录01
  • Fedora logo 改版最新进展:已有三个候选方案
  • 前端设计模式
  • 区块链将重新定义世界
  • 时间复杂度与空间复杂度分析
  • 面试必备指南:你的系统如何支撑高并发?
  • [学习笔记]虚树
  • Iterator 和 for...of 循环
  • SharePoint:如何使用PowerShell批量删除名称以XXX开始的List?
  • Kafka之与Spring集成
  • python 模块一览
  • 《流浪地球》:一个程序员用代码拯救了世界,真硬核!
  • 500位软件开发工程师的声音:微服务和CI/CD依旧是最爱
  • 机器学习进阶-图像形态学操作-膨胀操作 1.cv2.dilate(进行膨胀操作)
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【剑指offer】让抽象问题具体化
  • 【面试系列】之二:关于js原型
  • Android Volley源码解析
  • create-react-app项目添加less配置
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • in typeof instanceof ===这些运算符有什么作用
  • LintCode 31. partitionArray 数组划分
  • Mysql5.6主从复制
  • MySQL用户中的%到底包不包括localhost?
  • Promise初体验
  • Unix命令
  • Vue.js 移动端适配之 vw 解决方案
  • XML已死 ?
  • 包装类对象
  • 漂亮刷新控件-iOS
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何选择开源的机器学习框架?
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 鱼骨图 - 如何绘制?
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • "无招胜有招"nbsp;史上最全的互…
  • (2015)JS ES6 必知的十个 特性
  • (LeetCode C++)盛最多水的容器
  • (zt)最盛行的警世狂言(爆笑)
  • (笔试题)合法字符串
  • (过滤器)Filter和(监听器)listener
  • (三分钟)速览传统边缘检测算子
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)appium-desktop定位元素原理
  • (转)【Hibernate总结系列】使用举例
  • (转)http协议
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)Sql Server 保留几位小数的两种做法
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • (轉貼) UML中文FAQ (OO) (UML)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NetCore项目nginx发布