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

codeforces-1734C - Removing Smallest Multiples

题目 Removing Smallest Multiples

在这里插入图片描述
在这里插入图片描述

题目大意

给由0和1组成的字符串 T ,字符串长度为 n ,0表示该数字被删去,1表示存在,即T=010011的意思就是数字1~6中删去了数字1 3 4。
定义一种操作:每操作一次,就删去一个数字(该数字为 字符串中 k 的最小公倍数。)
将每次操作的 k 值相加,求和的最小值

题意解释

如果字符串 T 中 x个0,那么就是需要操作 x 次。
eg;n=8,T=10010101
那么就需要删去2 3 5 7

  1. 如果 k=1,1的最小公倍数是1,1会被删去,因此 k 不能为1;
    如果 k=2,2的最小公倍数是2,2会被删去,符合我们的需求。因此第一次操作,k 取2。
  2. 如果 k=1,1的最小公倍数是1,1会被删去,因此 k 不能为1;
    如果 k=2,字符串中2的最小公倍数是4,4会被删去,因此 k 不能为2。
    如果 k=3,3的最小公倍数是3,3会被删去,符合我们的需求。因此第二次操作,k 取3。
  3. 如果 k=1,1的最小公倍数是1,1会被删去,因此 k 不能为1;
    如果 k=2,字符串中2的最小公倍数不存在,因此 k 不为2。
    如果 k=3,字符串中3的最小公倍数是6,6会被删去,因此 k 不为3。
    如果 k=4,4的最小公倍数是4,4会被删去,因此 k 不为4。
    如果 k=5,5的最小公倍数是5,5会被删去,符合我们的需求。因此第三次,k 取5。
  4. 同理,第四次操作,k 取7。

总共花费 2+3+5+7=17

超时代码

这是我自己最开始写的,超时了,

#include<iostream>
#include<string.h>
#include<vector>
#include<math.h>
#define N 100000
using namespace std;
long long t,n;
string s;

long long sum; 
int a[N];//记录k不可以使用的值

void f(long long  x) {
	long long  k=1;
	while(k<=sqrt(x) ){
		if(x%k==0){
			a[k]=1;
			a[x/k]=1;}
		k++;
	}
}
void solve() {
	sum=0; 
	long long  sum=0;
	memset(a,0,sizeof(a));//初始化
	for(long long  i=1; i<=n; i++) {
		long long k=1;
		if(s[i-1]=='1') { //不需要删去,因此k不能等于这个数字 也不能等于该数字的因子
			f(i);//数组a i的因子全部为1
			continue;
		} else { //需要删     
			while(1) {
				if(i%k==0 && a[k]==0)
					break;//如果k是其因子且k可以取值为这个,说明找到了最小值k
				k++;
			}
			sum+=k;
		}
	}
	cout<<sum<<"\n";
}
int main() {
	cin>>t;
	while(t--) {
		cin>>n;
		cin>>s;
		solve();
	}
}

AC 代码

考虑如何选取一个

#include<iostream>
#include<string.h>
#include<vector>
#define INF 100000000
using namespace std;
long long t,n;
string s;

void solve() {
	vector<int> a(n,INF);//存储位置j的可以的k值
	for(int i=n; i>=1; i--) {//k的可能取值范围(1~n)  从大到小排 
		for(int j=i-1; j<n; j=j+i) {//找寻是k的倍数位置,由近及远
			if(s[j]=='1')//如果该位置(j)是1 则该位置(j)不能取该值i 
				break;
			a[j]=min(i,a[j]);//如果是0,则说明该位置(j)的k值可以为 i 
		}
	}
	long long ans=0;
	for(int i=0; i<n; i++)
		if(s[i]=='0')
			ans+=a[i];
	cout<<ans<<"\n";
}

int main() {
	cin>>t;
	while(t--) {
		cin>>n;
		cin>>s;
		solve();
	}
}

相关文章:

  • Java IO流的“四大家族”
  • 源码编译perl5遇到的问题汇总
  • 63 岁老工程师设计一屏双计算器软件工具,一起看看?
  • python实现自动换桌面壁纸恶搞程序【带源码】--------- 2.程序调试和打包
  • 抛开去中心化叙事 我们需要DAO的4个理由
  • 【Android入门】5、Broadcast 广播、Kotlin 的高阶函数、泛型、委托
  • clickhouse
  • 【周赛复盘】力扣第 312 场单周赛
  • QT通过QSS文件样式表设置改变窗体与按钮背景外观
  • kotlin基础知识
  • Keras学习记录之模型
  • LeetCode 0329. 矩阵中的最长递增路径
  • JavaEE:线程安全问题的原因和解决方案
  • Linux/CentOS 安装 flutter 与 jenkins 构建 (踩坑)
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • 【知识碎片】第三方登录弹窗效果
  • centos安装java运行环境jdk+tomcat
  • dva中组件的懒加载
  • go append函数以及写入
  • Java 23种设计模式 之单例模式 7种实现方式
  • Spring核心 Bean的高级装配
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 大数据与云计算学习:数据分析(二)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 将 Measurements 和 Units 应用到物理学
  • 前端自动化解决方案
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 区块链共识机制优缺点对比都是什么
  • 区块链技术特点之去中心化特性
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 系统认识JavaScript正则表达式
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 因为阿里,他们成了“杭漂”
  • Java性能优化之JVM GC(垃圾回收机制)
  • Prometheus VS InfluxDB
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​2021半年盘点,不想你错过的重磅新书
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #HarmonyOS:基础语法
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (阿里云万网)-域名注册购买实名流程
  • (七)Java对象在Hibernate持久化层的状态
  • (四) 虚拟摄像头vivi体验
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • .net framework profiles /.net framework 配置
  • .net 怎么循环得到数组里的值_关于js数组
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET成年了,然后呢?
  • .net生成的类,跨工程调用显示注释
  • @angular/cli项目构建--Dynamic.Form
  • @Autowired @Resource @Qualifier的区别
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [] 与 [[]], -gt 与 > 的比较