补题第四天

来源牛客竞赛

一,字符串

在这里插入图片描述

输入描述:
输入一个整数n(1<=n<=10^9),表示你需要构造的字符串中恰好含有n个子序列"AHUICPC"。

输出描述:
输出一行。一个长度不超过10^5的字符串。

示例1
输入
1

输出
AHUICPC

示例2
输入
2

输出
AHUIICPC

一看到字符串就产生了畏难心理了…现在看看没有这么难,所以说看到题目还是要仔细读题,寻找其中可能存在的规律

#include <bits/stdc++.h>
using namespace std;

int main(){
	int n;
	scanf("%d",&n);
	int a=sqrt(n),b=n/a,c=n-a*b;
	for(int i=0;i<a;i++) putchar('A');
	for(int i=0;i<b-1;i++) putchar('H');
	for(int i=0;i<c;i++) putchar('A');
	puts("HUICPC");
	return 0;
}

光是两个字母的不同位置组合就足以、、、

二 推理题

在这里插入图片描述
链接:https://ac.nowcoder.com/acm/contest/2720/H
来源:牛客网

输入描述:
输入一个整数n(1≤n≤10^14)

输出描述:
输出一个整数,表示你的军队规模达到n所需要消耗的最少法力值。

示例1

输入**
1

输出
0

示例2

输入
6

输出
5

说明
一开始你的军队只有一名士兵,消耗2点法力值使你的军队规模翻倍。于是现在你有了两名士兵,再消耗1点法力值使军队达到3人。此时再消耗2点法力值就能达到6人。一共消耗5点法力。

这道题看起来非常有趣,让我写的兴致也是格外高涨,结果…
复杂度好像超了,而且其实思路就是错的,还是应该找找规律理清思路再写啊

#include<iostream>
using namespace std;
typedef long long ll;

int main(){
	ll n,now,ans=0;
	scanf("%lld",&n);
	now=n;
	for(ll i=2;i*i<=n;i++){
		while(now%i==0){
			now=now/i;
			ans+=i;
		}
	}
	if(now>1) ans+=now;
	printf("%lld",ans);
	return 0;
}

把要达到的规模数n拆分成各个最小的因子,这样可以减少循环?可能是吧。
总之可以从中找到规律,翻几倍消耗几点法力值?应该是的。没有仔细看,但大体应该是这样了。
还有一种递归的写法,也放着, 应该会给自己一点启发

ll dfs(ll n){
    if(n==1){
        return 0;
    }
    ll k;
    for(k=2;k<=n/k;k++){
        if(n%k==0){
            break;
        }
    }
    if(k<=n/k){
        return k+dfs(n/k);
    }
    return n;
}
  
int main(){
    ll n;
    cin>>n;
    cout<<dfs(n);
}

就这样 晚安

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值