[hihocoder][Offer收割]编程练习赛49
相似颜色
#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<functional>
#include<math.h>
//#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef queue<int> QI; void makedata() {
freopen("input.txt", "w", stdout);
fclose(stdout);
} int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
//makedata();
std::ios::sync_with_stdio(), cin.tie();
char ch[];
int a[];
scanf("%s", ch);
for (int i = ; i <= ; i++) {
if ('' <= ch[i] && ch[i] <= '') a[i] = ch[i] - '';
else a[i] = ch[i] - 'a' + ;
}
printf("#");
for (int i = ; i <= ; i++) {
int x = a[i * - ] * + a[i * ];
x = (x + ) / ;
if (x < ) printf("%d", x);
else printf("%c", x - + 'a');
}
return ;
}
挑选子集
显然选出来的m个数对k同余。把n个数字按除k的余数分成k组,每组计算组合数相加。
#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<functional>
#include<math.h>
//#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef queue<int> QI; void makedata() {
freopen("input.txt", "w", stdout);
fclose(stdout);
} class AandC {
public:
long long *fac, *inv, *f;
long long mod;
AandC(long long m, int n) {
mod = m;
fac = (long long *)malloc((n) * sizeof(long long));
inv = (long long *)malloc((n) * sizeof(long long));
f = (long long *)malloc((n) * sizeof(long long));
fac[] = fac[] = inv[] = inv[] = f[] = f[] = ;
for (int i = ; i < n; i++) {
fac[i] = fac[i - ] * i % mod;
f[i] = (mod - mod / i) * f[mod % i] % mod;
inv[i] = inv[i - ] * f[i] % mod;
}
}
//choose b from a
long long A(int a, int b) {
return fac[a] * inv[a - b] % mod;
}
long long C(int a, int b) {
return fac[a] * inv[b] % mod * inv[a - b] % mod;
}
}; const lint mod = ;
AandC ac(mod, );
int a[]; int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
//makedata();
std::ios::sync_with_stdio(), cin.tie();
int n, m, k;
cin >> n >> m >> k;
memset(a, , sizeof(a));
for (int i = ; i < n; i++) {
int x;
cin >> x;
a[x % k]++;
}
lint ans = ;
for (int i = ; i < k; i++) {
if (a[i] >= m) {
ans += ac.C(a[i], m);
ans %= mod;
}
}
cout << ans << endl;
return ;
}
矩阵迷宫
动态规划,dp[i][j][k][l]表示位置为i,j,朝向为k,当前已经转弯l次的最小代价;k=0表示当前向右,k=1表示当前向下。
#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<functional>
#include<math.h>
//#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef queue<int> QI; void makedata() {
freopen("input.txt", "w", stdout);
fclose(stdout);
} int dp[][][][], a[][]; int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
//makedata();
std::ios::sync_with_stdio(), cin.tie();
int n;
cin >> n;
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
cin >> a[i][j];
}
}
memset(dp, 0x3F, sizeof(dp));
dp[][][][] = dp[][][][] = a[][];
for (int i = ; i < n; i++) {
dp[][i][][] = dp[][i - ][][] + a[][i];
dp[][i][][] = dp[][i][][] + ;
dp[i][][][] = dp[i - ][][][] + a[i][];
dp[i][][][] = dp[i][][][] + ;
}
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
for (int k = ; k < ; k++) {
if (k > i + || k > j + ) break;
dp[i][j][][k] = a[i][j] + min(dp[i][j - ][][k], dp[i - ][j][][k - ] + ( << (k - )));
dp[i][j][][k] = a[i][j] + min(dp[i][j - ][][k - ] + ( << (k - )), dp[i - ][j][][k]);
}
}
}
int ans = 0x3FFFFFFF;
for (int i = ; i < ; i++) {
ans = min(ans, dp[n - ][n - ][][i]);
ans = min(ans, dp[n - ][n - ][][i]);
}
cout << ans << endl;
return ;
}
第K小先序遍历
长度为n的中序遍历的可能二叉树数量为f(n)=(2n!)/((n+1)!n!),写成递推形式:f(n+1)=f(n)*(4n+2)/(n+2)。可见f(n+1)/f(n)<4,而n最多不超过30,所以刚好不需要高精度。
solve(i,j,k)表示从输出中序遍历为a[i]~a[j]的第k小的先序遍历。
按i~j区间上的元素从小到大的顺序计算分别以该元素为根节点有多少种可能的二叉树,若可能的二叉树数量大于k,则说明第k小的先序遍历是以该元素为根节点的。
#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<functional>
#include<math.h>
//#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef queue<int> QI; void makedata() {
freopen("input.txt", "w", stdout);
fclose(stdout);
} lint f[];
int a[];
bool v[];
void solve(int l, int r, int k) {
if (l > r) return;
memset(v, true, sizeof(v));
int x, y;
while () {
x = ;
for (int i = l; i <= r; i++) {
if (v[i] && a[i] < x) x = a[i], y = i;
}
if (f[y - l]*f[r - y] >= k) break;
else k -= f[y - l] * f[r - y], v[y] = false;
}
cout << a[y] << endl;
solve(l, y - , + ((k - ) / f[r - y]));
solve(y + , r, + ((k - ) % f[r - y]));
} int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
//makedata();
std::ios::sync_with_stdio(), cin.tie();
memset(f, , sizeof(f));
f[] = f[] = ;
for (int i = ; i < ; i++) {
f[i + ] = f[i] * ( * i + ) / (i + );
}
int n, k;
cin >> n >> k;
for (int i = ; i <= n; i++) cin >> a[i];
solve(, n, k);
return ;
}
[hihocoder][Offer收割]编程练习赛49的更多相关文章
- hihocoder [Offer收割]编程练习赛4
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...
- hihocoder [Offer收割]编程练习赛61
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...
- hihocoder offer收割编程练习赛8 C 数组分拆
思路:(引自bfsoyc的回答:http://hihocoder.com/discuss/question/4160) 动态规划.状态dp[i]表示 前i个数的合法的方案数,转移是 dp[i] = s ...
- hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)
题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x ...
- hihoCoder [Offer收割]编程练习赛3 D子矩阵求和
子矩阵求和 http://hihocoder.com/discuss/question/3005 声明一下: n是和x一起的,m是和y一起的 x是横着的,y是纵着的,x往右为正,y往下为正 (非常反常 ...
- hihocoder [Offer收割]编程练习赛52 D 部门聚会
看了题目的讨论才会做的 首先一点,算每条边(u, v)对于n*(n+1)/2种[l, r]组合的贡献 正着算不如反着算 哪些[l, r]的组合没有包含这条边(u, v)呢 这个很好算 只需要统计u这半 ...
- hihocoder [Offer收割]编程练习赛14
A.小Hi和小Ho的礼物 谜之第1题,明明是第1题AC率比C还要低.题目是求在n个不同重量袋子选4袋,2袋给A,2袋给B,使2人获得重量相同,求问方案数. 我也是一脸懵b...o(n2)暴力枚举发现把 ...
- hihocoder [Offer收割]编程练习赛8
第一次做这种比赛,被自己坑的好惨... A.这道题的关键其实是如果有k和n满足kD+F>nL>kD则不能走无限远,分支看似难整理,其实比较简单,F>L根本就不用算了,明摆着就是Bsi ...
随机推荐
- 【Android】进程间通信IPC——AIDL
AIDL官网定义AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似. 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口. 在 Androi ...
- BZOJ 1106: [POI2007]立方体大作战tet 树状数组 + 贪心
Description 一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规 则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n ...
- 【第二课】kaggle案例分析二
Evernote Export 推荐系统比赛(常见比赛) 推荐系统分类 最能变现的机器学习应用 基于应用领域分类:电子商务推荐,社交好友推荐,搜索引擎推荐,信息内容推荐等 **基于设计思想:**基于协 ...
- Linux:只复制文件权限和所有者
在Linux上,怎么把一个文件的<权限和所有者>赋给另一个文件呢? chown命令可以设置所有者和用户组:chmod可以设置文件的权限.这两个命令都支持使用另一个文件做为引用(RFILE) ...
- Day5 练习
1. 2. 要加强对代码效率的思考 3. 4. 知识点:1)多变量的同时赋值 2)元素的不可修改性:(1,2)=(3,4)与(a,b)= (b,a) 联想指针.地址去理解 :可用id()或t ...
- eas之创建一个UI界面并对其操作
private void BranchAddNew(ActionEvent e) { UIContext uiContext = new UIContext(this); ui ...
- codeforces 467C George and Job(简单dp,看了题解抄一遍)
题目 参考了网页:http://www.xue163.com/exploit/180/1802901.html //看了题解,抄了一遍,眼熟一下,增加一点熟练度 //dp[i][j]表示是前i个数选出 ...
- Django1.11配合uni-app发起微信支付!
Django1.11配合uni-app发起微信支付! 经过三天的断断续续的奋战,我终于是干动了微信支付.为了以后不忘记,现在来一篇教程,来来来,开干!!! 一.准备阶段 1.准备阶段我们需要去微信官网 ...
- 最小化安装CentOS-7-x86_64-Minimal-1511图文教程
说明: 虚拟机产品:VMware® Workstation 12 Pro,版本:12.5.0 build-4352439 系统镜像:CentOS-7-x86_64-Minimal-1511.iso 操 ...
- 1.2、使用pip安装Python包
大多数 Python 包都使用 pip 实用工具安装,使用 virtualenv 创建虚拟环境时会自动安装 pip.激活虚拟环境后,pip 所在的路径会被添加进 PATH. 注:如果你在 Python ...