AC修炼计划(AtCoder Regular Contest 166)

news/2024/6/16 16:42:39 标签: c++, 算法, 动态规划

传送门:AtCoder Regular Contest 166 - AtCoder

一直修炼cf,觉得遇到了瓶颈了,所以想在atcode上寻求一些突破,今天本来想尝试vp AtCoder Regular Contest 166,但结局本不是很好,被卡了半天,止步于B题。不过确实,感觉AtCoder的题目还是很不错的,一改cf的很多惯性思路。

这里借用了大佬樱雪喵的题解链接,大佬的传送门如下Atcoder Regular Contest 166 - 樱雪喵 - 博客园 (cnblogs.com)

B - Make Multiples

问题陈述

给你一个整数序列 A=(A1​,…,AN​),以及正整数 a,b 和 c。

你可以对这个数列进行以下运算,次数不限,可能为零。

  • 选择一个整数 i,使得 1≤i≤N.将 Ai​ 替换为 Ai​+1。

你的目标是使数列 A 至少包含一个 a 的倍数,至少一个 b 的倍数,以及至少一个 c 的倍数。求实现这一目标所需的最少运算次数。

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
const ll MX=0x3f3f3f3f3f3f3f3f;

int n,m;
int lcm(int a,int b){
    return a*b/__gcd(a,b);
}
void icealsoheat(){
    int a,b,c;
    cin>>n>>a>>b>>c;
    vector dp(n+5,vector(10,MX));
    int op[]={1,a,b,lcm(a,b),c,lcm(a,c),lcm(c,b),lcm(lcm(a,c),b)};
    dp[0][0]=0;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        for(int j=0;j<8;j++){
            for(int k=0;k<8;k++){
                if((j&k)==0){
                    // dp[i+1][j|k]=min(dp[i+1][j|k],dp[i][j]+op[k])
                    if(x%op[k]==0){
                        dp[i+1][j|k]=min(dp[i+1][j|k],dp[i][j]);
                    }
                    else{
                        dp[i+1][j|k]=min(dp[i+1][j|k],dp[i][j]+(x/op[k]+1ll)*op[k]-x);
                    }
                }
            }
        }
        // cout<<dp[n][7]<<"\n";
    }
    cout<<dp[n][7]<<"\n";




}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _;
    _=1;
    // cin>>_;
    while(_--){
        icealsoheat();
    }
}

C - LU / RD Marking

问题陈述

有一个网格,网格中有 H 行和 W 列。

这个网格有H(W+1)条垂直边和W(H+1)条水平边,共计H(W+1)+W(H+1)条(另见输入/输出示例中的数字)。请考虑通过以下两种操作来标记这些边。

  • 操作 (1)**:选择一个正方形,在进行此操作时,其左边缘和上边缘均未标记。标记该正方形的左边缘和上边缘。
  • 操作 (2):选择一个右边和下边在执行此操作时没有标记的正方形。标出该正方形的右边和下边。

求操作(1)和操作(2)执行任意多次(可能为零)时,最终被标记的边的可能集合的数量,模为 998244353998244353。

您有 T 个测试案例需要解决。

这里要借用官方题解的图例:

由此将方块拆开找规律。

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
const ll MX=0x3f3f3f3f3f3f3f3f;
int n,m;
int dp[2000008];
int sum[2000008];
int kuai(int a,int b){
    int ans=1;
    while(b){
        if(b&1)ans=ans*a%N;
        b>>=1;
        a=a*a%N;
    }
    return ans%N;
}
void icealsoheat(){
    cin>>n>>m;
    if(n>m)swap(n,m);
    int ans=sum[n]*kuai(dp[2*n],m-n)%N;
    cout<<ans<<"\n";
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _;
    _=1;
    cin>>_;
    dp[0]=1;
    dp[1]=2;
    for(int i=2;i<=2000005;i++){
        dp[i]=dp[i-1]+dp[i-2];
        dp[i]%=N;
    }
    sum[0]=1;
    for(int i=1;i<=1000000;i++){
        sum[i]=sum[i-1]*dp[2*i-1]%N*dp[2*i-1]%N;
    }
    while(_--){
        icealsoheat();
    }
}

D - Interval Counts

因为这题还是比较好想的所以直接上代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
const ll MX=0x3f3f3f3f3f3f3f3f;
int n,m;
void icealsoheat(){
	cin>>n;
	vector<int>x;
	vector<int>y;
	x.push_back(-2e9);
	y.push_back(0);
	for(int i=1;i<=n;i++){
		int xx;
		cin>>xx;
		x.push_back(xx);
	}
	vector<PII>ve;
	for(int i=1;i<=n;i++){
		int xx;
		cin>>xx;
		y.push_back(xx);
	}
	ll maxx=2e9;
	int id=0;
	for(int i=1;i<=n;i++){
		if(y[i]==y[i-1])continue;
		else if(y[i]>y[i-1])ve.push_back({x[i-1]+1,y[i]-y[i-1]});
		else{
			int now=y[i-1]-y[i];
			while(id<ve.size()&&ve[id].second<=now){
				maxx=min(x[i]-1-ve[id].first,maxx);
				now-=ve[id].second;
				id++;
			}
			if(now&&id<ve.size()){
				ve[id].second-=now;
				maxx=min(x[i]-1-ve[id].first,maxx);
			}
		}
	}
	if(maxx>1e9)printf("-1\n");
	else printf("%lld\n",maxx);


}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _;
    _=1;
    // cin>>_;

    while(_--){
        icealsoheat();
    }
}

http://www.niftyadmin.cn/n/5085200.html

相关文章

LeetCode【128】最长连续序列

题目&#xff1a; 分析&#xff1a; 1、最长连续序列的长度为 y-x1&#xff0c;如1-4&#xff1a;4-11 4 2、不要被这里的On误导&#xff0c;不敢使用双层循环 3、只要找到最小的数值&#xff0c;并由此开始计算&#xff0c;不产生重复计算&#xff0c;则为On 代码&#xf…

深度神经网络压缩与加速技术

// 深度神经网络是深度学习的一种框架&#xff0c;它是一种具备至少一个隐层的神经网络。与浅层神经网络类似&#xff0c;深度神经网络也能够为复杂非线性系统提供建模&#xff0c;但多出的层次为模型提供了更高的抽象层次&#xff0c;因而提高了模型的能力。深度神经网络是一…

总结SQL中add constraint的用法

【总结】alter table *** add constraint *** 用法 1.主键约束&#xff1a; 要对一个列加主键约束的话&#xff0c;这列就必须要满足的条件就是分空 因为主键约束&#xff1a;就是对一个列进行了约束&#xff0c;约束为&#xff08;非空、不重复&#xff09; 以下是代码 要对…

nodejs+vue+elementui养老院老年人服务系统er809

“养老智慧服务平台”是运用nodejs语言和vue框架&#xff0c;以MySQL数据库为基础而发出来的。为保证我国经济的持续性发展&#xff0c;必须要让互联网信息时代在我国日益壮大&#xff0c;蓬勃发展。伴随着信息社会的飞速发展&#xff0c;养老智慧服务平台所面临的问题也一个接…

PHP实现阿里云短信服务

注册阿里云账号然后在云通信中选择短信服务&#xff0c;开通阿里云短信服务&#xff0c;需要申请一个签名和模板 在AccessKEY管理中获取AccessKey ID和AccessKey Secret(访问阿里云API的密钥) 创建短信签名和短信模板&#xff0c;在阿里云短信服务管理控制台添加短信签名和短信…

STM32物联网基于ZigBee智能家居控制系统

实践制作DIY- GC0169-ZigBee智能家居 一、功能说明&#xff1a; 基于STM32单片机设计-ZigBee智能家居 二、功能介绍&#xff1a; 1个主机显示板&#xff1a;STM32F103C最小系统ZigBee无线模块OLED显示器 语音识别模块多个按键ESP8266-WIFI模块&#xff08;仅WIFI版本有&…

WIFI产品使用指导说明

一、登录服务器 二、新建产品 三、设置WIFI产品的联网参数 1、恢复出厂设置 2、设置参数 四、操作更新 网络连接特性&#xff1a; 路由器掉线得情况下&#xff0c; 第一次&#xff0c;搜索网络1分钟间隔第二次&#xff0c;搜索网络1分钟间隔第三次&#xff0c;搜索网络…

React知识点系列(1)-每天10个小知识

目录 1.什么是 React&#xff0c;以及它在前端开发中的优势是什么&#xff1f;2.你是如何组织和管理 React 组件的&#xff1f;3.你能解释一下 React 的生命周期方法吗&#xff1f;你通常在哪个生命周期方法中发起网络请求&#xff1f;4.什么是 React Hooks&#xff1f;你常用哪…