2020牛客寒假算法基础集训营3

F 牛牛的Link Power I
思路:
当前遍历到的数若为1,则加上与前方所有数的距离(sum);
当前遍历数若为0,则加上已经有的1的数量(cnt),已有1更新,(cnt++)。
O(n)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;

ll sum,ans,cnt;
string s;

int main(){
	int n;
	cin >> n;
	cin >> s;
	for(int i=0;i<n;i++){
		sum = (sum + cnt) % mod;
		if(s[i] == '1'){
			ans = (ans + sum) % mod;
			cnt++;
		}
	}
	cout << ans << endl;
	return 0;
}

H 牛牛的k合因子数
思路:
埃氏筛筛合数并将该合数及其倍数的合数因子数量更新。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
 
using namespace std;
typedef long long ll;
const ll MAXN = 1e5 + 5;
 
bool vis[MAXN];
ll cnt[MAXN];
ll num[MAXN];
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll n,m,k,x;
    cin >> n >> m;
    for(int i=2;i<=n;i++){
        if(vis[i]){
            for(int j=i;j<=n;j+=i) num[j]++;//该合数及其倍数++
        }else{
            for(int j=i+i;j<=n;j+=i) vis[j]=1;//标记合数
        }
    }
    for(int i=1;i<=n;i++) cnt[num[i]]++;//num[i]为每个合数的合数因子数量 cnt数组记录k合因子的数量
    while(m--){
        cin >> x;
        cout << cnt[x] <<'\n';
    }
    return 0;
}

I 牛牛的汉诺塔
所给条件(伪代码):

Function Hanoi(n,a,b,c)
    if n==1 then
        print(a+'->'+c)
    else
        Hanoi(n-1,a,c,b)
        print(a+'->'+c)
        Hanoi(n-1,b,a,c)
    end if
end Function 

思路:
由题意的递归关系式想到dp
dp递推式:
f[i][1]=f[i-1][2]+f[i-1][6];
f[i][2]=f[i-1][1]+1+f[i-1][4]; //+1表示最后一个要放回到C
f[i][3]=f[i-1][4]+f[i-1][5];
f[i][4]=f[i-1][3]+f[i-1][2];
f[i][5]=f[i-1][6]+f[i-1][3];
f[i][6]=f[i-1][5]+f[i-1][1];

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN = 1e6 + 5;
 
ll f[70][10];
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    f[1][2]=1;
    for(int i=2;i<=n;i++){
        f[i][1]=f[i-1][2]+f[i-1][6];
        f[i][2]=f[i-1][1]+1+f[i-1][4];
        f[i][3]=f[i-1][4]+f[i-1][5];
        f[i][4]=f[i-1][3]+f[i-1][2];
        f[i][5]=f[i-1][6]+f[i-1][3];
        f[i][6]=f[i-1][5]+f[i-1][1];
    }
    cout << "A->B:" << f[n][1] << endl;
    cout << "A->C:" << f[n][2] << endl;
    cout << "B->A:" << f[n][3] << endl;
    cout << "B->C:" << f[n][4] << endl;
    cout << "C->A:" << f[n][5] << endl;
    cout << "C->B:" << f[n][6] << endl;
    cout << "SUM:" << (ll)pow(2,n)-1 << endl;
    return 0;
}
全部评论

相关推荐

09-22 11:42
门头沟学院 Java
现在还很懵,不是什么很好的工资,但是很怕拒绝了秋招就没有offer了试用期3个月&nbsp;无责底薪7k➕绩效&nbsp;转正8k&nbsp;base南昌&nbsp;没有住房补贴&nbsp;餐补&nbsp;不知道作为一个应届生这个待遇怎么样?
白火同学:南昌能给到8k,还有绩效其实不错了。因为南昌房租不高,我22年在谢家村那边市中心租房只要1k就能租到还不错的房子,其他消费也是正常省会水平,所以南昌8k ≈ 一线10k上下吧。双非应届校招能拿这个薪资水平确实可以了,唯一不足的就是南昌IT行业整体不太行,以后跳槽多少有点不方便。
我的秋招日记
点赞 评论 收藏
分享
点赞 评论 收藏
分享
运营你豪哥:1.模板换一个,现在的模板基础信息加个照片已经占了30%的空间。 2.实习经历的描述,按时间倒序标注清楚,选2-3段和你求职意向契合的经历填写。 3.自我评价再改改,要不就删了;怎么感觉自我评价是在介绍你专业的培养体系,看不出重点要突出什么。
听劝,这个简历怎么改
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务