A.排队问题*-*

题意就是有长度为L的序列,每位的取值可以是'f'或者'm',问不包含'fff'和'fmf'的个数。

打表找规律

不难找出递推公式为F[n] = F[n-1] + F[n-3] + F[n-4]。

然后直接遍历就可以了...突然发现L范围很小,我写了个矩阵快速幂...

多组数据且模数不固定,矩阵快速幂即可

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll; int n,mod; struct M {
ll p[][];
M(int num) {
memset(p,,sizeof p);
for (int i = ; i < ; i++) {
p[i][i] = num;
}
} M operator * (M b) {
M c();
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
c.p[i][j] = ;
for (int k = ; k < ; k++) {
c.p[i][j] = (c.p[i][j] + (p[i][k]*b.p[k][j])%mod)%mod; }
}
}
return c;
} M operator ^ (ll k) {
M c(),a = *this;
while (k) {
if (k&) {
c = a*c;
}
a = a*a;
k >>= ;
}
return c;
} };
M a(),b();
int solve() {
M c(); if (n == ) {
return ;
} else if (n <= ) {
return a.p[-n][]%mod;
}
c = b^(n-);
c = c*a;
return c.p[][]%mod;
} string s; void db() {
for (int i = ; i <= ; i++) {
int p = pow(2.0,i),tot = ,cnt = ;
for (int j = ; j < p; j++) {
int tmp = ;
s = "";
for (int k = ; k <= i; k++) {
if (tmp&j) {
s += 'f';
} else {
s += 'm';
}
tmp <<= ;
}
for (int k = ; k < int(s.size())-; k++) {
if (s[k] =='f' && s[k+] == 'm' && s[k+] == 'f') {
cnt++;
break;
} else if (s[k] =='f' && s[k+] == 'f' && s[k+] == 'f') {
cnt++;
break;
}
}
tot++;
}
cout << i << ' ' << p-cnt << endl;
}
}
/*
f_i = f_{i-1} + f_{i-3} +f_{i-4};
1 0 1 1
1 0 0 0
0 1 0 0
0 0 1 0
*/
int main() {
ios_base::sync_with_stdio();
cin.tie();
db(); a.p[][] = ;
a.p[][] = ;
a.p[][] = ;
a.p[][] = ;
b.p[][] = ;
b.p[][] = ;
b.p[][] = ;
b.p[][] = ;
b.p[][] = ;
b.p[][] = ;
while (cin >> n >> mod) {
cout << solve() << endl;
}
return ;
}

此处应有严格证明递推公式的由来,然而我不会。。。

B.就差把标程贴上去了

公式都已经放出来了

一个数的长度也就是len(x) = log(x)/log(10) + 1,这里我们取对数就可以得到len(n!) = 1/2*log10(2.0*PI*n) + n*log10(n/e)+1。

这里其实就够了,当然你可以继续化简到和我代码一样= =

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pi (acos(-1))
ll n,d; void solve() {
cin >> n;
d = (int) ((0.5*log(*pi*n) + n*log(n)-n) / log ());
cout << d+ << endl;
} int main() {
ios_base::sync_with_stdio();
cin.tie();
int _;
cin >> _;
while (_--) {
solve();
}
return ;
}

C.假算法天下第一

搞了半天 搞懂了题意,就是一个数组分k次(至多),然后要求每部分尽量小,再求这k个部分的最大值。

emmm就是一个最大值最小化问题,LRJ的《算法入门经典》里面有详细介绍。

我们可以用二分思考这道题,我们使用二分确定一个值x,使得x尽量小并且每个区间都不大于它。

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pi (acos(-1))
int n,k;
ll p[];
bool flag[]; void work(ll l, ll r) {
while(l < r) {
bool flag1 = false;
ll mid = (l + r) / ;
ll sum = , kide = ; for(int i = ; i < n; i++) {
if(sum < mid && sum + p[i] < mid) {
sum += p[i];
}
else {
if(p[i] < mid) {
kide++;
sum = ;
sum += p[i];
} else {
flag1 = true;
break;
}
}
} if(flag1 || kide > k) {
l = mid + ;
} else {
r = mid;
}
} ll sum = ; for(int i = n - ; i >= ; i--) {
if(sum < l && sum + p[i] < l) {
sum += p[i];
}
else {
sum = ;
flag[i] = true;
sum += p[i];
}
} int di = ;
int pos = ; for(int i = n - ; i >= ; i--) {
if(flag[i]) {
di++;
}
} if(di != k) {
for(int i = ; i < n && di != k; i++) {
if(!flag[i]) {
flag[i] = true;
di++;
}
}
} ll tmp = , ans = ; for(int i = ; i < n; i++) {
if(flag[i] && i != n - ) {
tmp += p[i];
ans = max(tmp, ans);
tmp = ;
} else if(i != n - ) {
tmp += p[i];
} else {
tmp += p[i];
}
//cout << tmp << endl;
} ans = max(tmp, ans);
cout << ans << endl;
} void solve() {
cin >> n >> k;
n--;
ll sum = ; for(int i = ; i < n; i++) {
cin >> p[i];
sum += p[i];
}
if (k == ) {
cout << sum << endl;
} else {
work(, sum);
}
} int main() {
ios_base::sync_with_stdio();
cin.tie();
solve();
return ;
}

然后我发现了个神奇的代码

ZB果然nb = =

D.美好的一天从WA+1开始

题意就不说了,反悔贪心的题目,首先我们按照日期进行贪心,然后用堆维护一下选区的物品,当遇到某件物品不能选取但是他的值却大于以前选过的某个,就进行替换。

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pi (acos(-1))
int n;
int na,nb;
vector<pair<int,int>> p();
ll sum,avg; void init() {
} void solve() {
while (cin >> n) {
sum = ;
priority_queue<int,vector<int>,greater<int>> q;
for (int i = ; i <= n; i++) {
cin >> p[i].second >> p[i].first;
}
sort(p.begin()+,p.begin()++n);
for (int i = ; i <= n; i++) {
if (q.size() < p[i].first) {
q.push(p[i].second);
sum += p[i].second;
} else {
if (p[i].second > q.top()) {
sum -= q.top();
sum += p[i].second;
q.pop();
q.push(p[i].second);
}
}
}
cout << sum << endl;
}
} int main() {
ios_base::sync_with_stdio();
cin.tie();
solve();
return ;
}

E.矮死 发 矮死 破色波

没什么好说的,优先喝b就行了。

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pi (acos(-1))
int n,a,b;
int na,nb;
int p[]; void solve() {
cin >> n >> a >> b;
na = a;
nb = b;
for (int i = ; i <= n; i++) {
cin >> p[i];
}
for (int i = ; i <= n; i++) {
if (p[i]) {
if (na > && nb < b) {
na--;
nb++;
} else if (nb > ) {
nb--;
} else if (na > ) {
na--;
} else {
cout << i- << endl;
return;
}
} else {
if (nb > ) {
nb--;
} else if (na > ) {
na--;
} else {
cout << i- << endl;
return;
}
}
}
cout << n << endl;
} int main() {
ios_base::sync_with_stdio();
cin.tie();
solve();
return ;
}

排版乱糟糟的,好久没写博客了= =,数学公式将就着看看吧= =,我也不知道博客园怎么弄Latex。

FJUT2019暑假周赛一题解的更多相关文章

  1. FJUT2019暑假周赛三部分题解

    A本来想改到q<1e5,让你们预处理的,然后想了哈作为个逆元模板题吧= =,做不出来自行反思. B贴个题面 因为只有一次机会,那么也就是两点分布期望E = p了,先说说大家的做法,先求出每个n的 ...

  2. FJUT2019暑假第二次周赛题解

    A 服务器维护 题目大意: 给出时间段[S,E],这段时间需要人维护服务器,给出n个小时间段[ai,bi],代表每个人会维护的时间段,每个人维护这段时间有一个花费,现在问题就是维护服务器[S,E]这段 ...

  3. Leetcode 周赛#202 题解

    本周的周赛题目质量不是很高,因此只给出最后两题题解(懒). 1552 两球之间的磁力 #二分答案 题目链接 题意 有n个空篮子,第i个篮子位置为position[i],现希望将m个球放到这些空篮子,使 ...

  4. [NowCoder]牛客OI周赛1 题解

    A.分组 首先,认识的人不超过3个,因此不存在无解的方案 考虑直接构造,先把所有点设为1,顺序扫一遍把有问题的点加入队列 每次取队头,将其颜色取反,再更新有问题的点 复杂度:考虑到每个点不会操作2次, ...

  5. 2018HUAS_ACM暑假比赛5题解

    目录 Problem A Problem B Problem C Problem D Problem E Problem F Problem A 思路 这是一道带权并查集问题 因为只有三种种类,我们分 ...

  6. LeetCode周赛#204 题解

    1566. 重复至少 K 次且长度为 M 的模式 #模拟 题目链接 题意 给定正整数数组 arr,请你找出一个长度为 m 且在数组中至少重复 k 次的模式. 模式 是由一个或多个值组成的子数组(连续的 ...

  7. LeetCode周赛#203 题解

    1561. 你可以获得的最大硬币数目 #贪心 题目链接 题意 有 3n 堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币: 每一轮中,你将会选出 任意 3 堆硬币(不一定连续). Alice 将会 ...

  8. LeetCode双周赛#33 题解

    5480. 可以到达所有点的最少点数目 #贪心 题目链接 题意 给定有向无环图,编号从0到n-1,一个边集数组edges(表示从某个顶点到另一顶点的有向边),现要找到最小的顶点集合,使得从这些点出发, ...

  9. Leetcode 双周赛#32 题解

    1540 K次操作转变字符串 #计数 题目链接 题意 给定两字符串\(s\)和\(t\),要求你在\(k\)次操作以内将字符串\(s\)转变为\(t\),其中第\(i\)次操作时,可选择如下操作: 选 ...

随机推荐

  1. 理解Go协程与并发

    协程 Go语言里创建一个协程很简单,使用go关键字就可以让一个普通方法协程化: package main import ( "fmt" "time" ) fun ...

  2. 身体质量指数BMI

    Solution: 方法一:"Python语言程序设计"(中国大学MOOC平台)的答案 分析:对比两种指标,将共性(相同的区间)和异性(不同的区间)细分.这样两种指标的判断条件(不 ...

  3. UI 组件 | Button

    最近在与其他自学 Cocos Creator 的小伙伴们交流过程中,发现许多小伙伴对基础组件的应用并不是特别了解,自己在编写游戏的过程中也经常对某个属性或者方法的用法所困扰,而网上也没有比较清晰的用法 ...

  4. Python RPC 之 gRPC

    gRPC 简介: gRPC 是一款高性能.开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang.Python.Java等),本篇只介绍 Py ...

  5. python 39 socketserver 模块并发通信

    socketserver模块 socketserver模块实现一个服务端与多个客户端通信.是在socket的基础上进行了一层封装,底层还是调用的socket. socketserver干了两件事: 1 ...

  6. unity_数据结构(常见数据结构及适用场景)

    常见的数据结构: 1.Array: 最简单的数据结构 特点:数组存储在连续的内存上.数组的内容都是相同类型.数组可以直接通过下标访问.优点:由于是在连续内存上存储的,所以它的索引速度非常快,访问一个元 ...

  7. 人员考勤,MySQLl数据库一个表自动生成3表筛选人员迟到早退缺勤

    前言:漂亮的人事小姐姐找我帮忙弄考勤:由于人员考勤和门禁一起,打卡记录太多,打卡机只能导出一个打卡Excel总表,不容易人工筛选. Excel表的格式是这样的:(这里101代替真实人名) 实现目标: ...

  8. Java多线程之线程的暂停

    Java多线程之线程的暂停 下面该稍微休息一下了呢……不过,这里说的是线程休息,不是我们哦.本节将介绍一下让线程暂停运行的方法. 线程Thread 类中的sleep 方法能够暂停线程运行,Sleep ...

  9. Web安全开发规范手册V1.0

    一.背景 团队最近频繁遭受网络攻击,引起了部门技术负责人的重视,笔者在团队中相对来说更懂安全,因此花了点时间编辑了一份安全开发自检清单,觉得应该也有不少读者有需要,所以将其分享出来. 二.自检清单 检 ...

  10. 传入值参数&传入引用参数的区别

    传值&传引用 1.传值 是把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 2.传地址 是传值的一种特殊方式,只是他传递的是地址 那么传地址以后,实参和行参都指向同一个对象 3.传引用 ...