哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级) Solution
A:
Solved.
分别处理出每个%7后余数的数字个数,再组合一下
#include <bits/stdc++.h>
using namespace std; #define ll long long
int n, m;
ll cnt[][]; ll calc(ll x, ll y)
{
if (x % >= y) return x / + ;
return x / ;
} int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
memset(cnt, , sizeof cnt);
for (int i = ; i < ; ++i)
{
cnt[][i] += calc(n, i);
cnt[][i] += calc(m, i);
}
ll res = ;
--cnt[][], --cnt[][];
cnt[][] = cnt[][];
for (int i = ; i < ; ++i)
res += cnt[][i] * cnt[][ - i];
printf("%lld\n", res);
}
return ;
}
B:
Solved.
状压DP.
#include <bits/stdc++.h>
using namespace std; #define ll long long
int n,m;
ll f[][<<];
bool ins[<<];
int main(){
while(cin>>n>>m&&n){
for(int i=;i<(<<m);i++){
bool cnt=,hasodd=;
for(int j=;j<m;j++)
if((i>>j)&)hasodd|=cnt,cnt=;
else cnt^=;
ins[i]=hasodd|cnt?:; }
f[][]=;
for(int i=;i<=n;i++)
for(int j=;j<(<<m);j++){
f[i][j]=;
for(int k=;k<(<<m);k++){
if((j&k)==&&ins[j|k])
f[i][j]+=f[i-][k];
} }
cout<<f[n][]<<endl;
}
}
C:
Solved.
#include<bits/stdc++.h> using namespace std; int n, s; int main()
{
while(~scanf("%d %d", &n, &s))
{
int Min = 0x3f3f3f3f;
for(int i = ; i < n; ++i)
{
int num = ;
scanf("%d" , &num);
Min = min(Min, num);
}
printf("%d\n", s * Min);
}
return ;
}
D:
Solved.
#include<bits/stdc++.h> using namespace std; const int maxn = ;
int n, s;
int arr[maxn]; int main()
{
while(~scanf("%d %d", &n, &s))
{
for(int i = ; i <= n; ++i)
{
scanf("%d", arr + i);
}
sort(arr + , arr + + n);
printf("%d\n", arr[n - ] * s);
}
return ;
}
E:
Solved.
最长公共子序列。
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int f[maxn][maxn];
char s1[maxn],s2[maxn];
int main(){
cin>>s1+>>s2+;
int n=strlen(s1+),m=strlen(s2+);
for(int i=;i<=n;i++)
{ for(int j=;j<=m;j++)
{
f[i][j]=max(f[i - ][j], f[i][j - ]);
if(s1[i]==s2[j])
{
f[i][j]=max(f[i][j],f[i-][j-] + );
} }
}
printf("%d\n",f[n][m]);
}
F:
Solved.
$dp[i][j][k] 表示到达i, j 的时候步数为k的方案数$
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
const ll MOD = 1e9 + ;
ll dp[maxn][maxn][maxn];
int fx[][]={{,},{,-},{-,},{-,-},{,},{,-},{-,},{-,-}};
int n,m,s;
inline bool check(int x,int y){
if(x< || x>n || y< ||y>m)return false;
return true;
}
int main(){
while(cin>>n>>m>>s)
{
memset(dp, , sizeof dp);
dp[][][]=;
for(int k=;k<=s;k++)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++){
for(int t=;t<;t++)
{
int x=i+fx[t][];
int y=j+fx[t][];
if(check(x,y)){
dp[i][j][k]+=dp[x][y][k-];
dp[i][j][k]%=MOD;
}
}
}
}
}
cout<<dp[n][m][s]<<endl;
}
}
G:
Unsolved.
H:
Solved.
考虑离线,对$每个数处理出到L左边离它最近的非互质的数,以及到R右边$离它最近的非互质的数,
再考虑先固定$l, 对每一个r处理出答案$
再考虑什么时候把数的贡献加进去,仅当这个数的$L < l 的时候便可以加入贡献,贡献的范围是[pos, R - 1], pos 表示那个数的位置$
#include <bits/stdc++.h>
using namespace std; #define N 100010
#define pii pair <int, int>
int n, q, a[N], l[N], r[N], dp[N], ans[N], vis[N];
vector <int> fac[N];
vector <pii> v[N], qv[N]; namespace SEG
{
int a[N << ], lazy[N << ];
void build(int id, int l, int r)
{
a[id] = ;
if (l == r) return;
int mid = (l + r) >> ;
build(id << , l, mid);
build(id << | , mid + , r);
}
void pushdown(int id, int l, int r, int mid)
{
if (!lazy[id]) return;
lazy[id << ] += lazy[id];
a[id << ] += lazy[id] * (mid - l + );
lazy[id << | ] += lazy[id];
a[id << | ] += lazy[id] * (r - mid);
lazy[id] = ;
}
void pushup(int id) { a[id] = a[id << ] + a[id << | ]; }
void update(int id, int l, int r, int ql, int qr, int val)
{
if (l >= ql && r <= qr)
{
a[id] += val * (r - l + );
lazy[id] += val;
return;
}
int mid = (l + r) >> ;
pushdown(id, l, r, mid);
if (ql <= mid) update(id << , l, mid, ql, qr, val);
if (qr > mid) update(id << | , mid + , r, ql, qr, val);
pushup(id);
}
int query(int id, int l, int r, int pos)
{
if (l == r) return a[id];
int mid = (l + r) >> ;
pushdown(id, l, r, mid);
if (pos <= mid) return query(id << , l, mid, pos);
else return query(id << | , mid + , r, pos);
}
} void init()
{
for (int i = ; i <= ; ++i)
{
if (vis[i]) continue;
fac[i].push_back(i);
for (int j = * i; j <= ; j += i)
{
vis[j] = ;
fac[j].push_back(i);
}
}
} int main()
{
init();
while (scanf("%d%d", &n, &q) != EOF)
{
for (int i = ; i <= n + ; ++i) l[i] = , r[i] = n + , v[i].clear(), qv[i].clear();
for (int i = ; i <= n; ++i) scanf("%d", a + i);
memset(vis, , sizeof vis);
for (int i = ; i <= n; ++i)
for (auto it : fac[a[i]])
l[i] = max(l[i], vis[it]), vis[it] = i;
memset(vis, 0x3f, sizeof vis);
for (int i = n; i >= ; --i)
for (auto it : fac[a[i]])
r[i] = min(r[i], vis[it]), vis[it] = i;
//for (int i = 1; i <= n; ++i) printf("%d %d\n", l[i], r[i]);
//for (int i = 1; i <= n; ++i) for (int j = 0, len = fac[a[i]].size(); j < len; ++j) printf("%d%c", fac[a[i]][j], " \n"[j == len - 1]);
for (int i = ; i <= n; ++i)
v[l[i]].emplace_back(r[i], i);
for (int qq = , l, r; qq <= q; ++qq)
{
scanf("%d%d", &l, &r);
qv[l].emplace_back(r, qq);
}
SEG::build(, , n);
for (int i = ; i <= n; ++i)
{
for (auto it : v[i - ])
SEG::update(, , n, it.second, it.first - , );
for (auto it : qv[i])
ans[it.second] = SEG::query(, , n, it.first);
SEG::update(, , n, i, r[i] - , -);
}
for (int i = ; i <= q; ++i) printf("%d\n", ans[i]);
}
return ;
}
I:
Solved.
特判$n == 0 并且 m == 0 的情况$
其他情况下,因为$k >= |n - m| 先手的人只需要去掉石子使得两堆相同,然后跟着另一个人取就可以必胜$
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll n, m, k; int main()
{
while(~scanf("%lld %lld %lld", &n, &m, &k))
{
if(n == || m == ) puts("LAOZI CHUI SI NI!");
else puts("HAI YOU SEI!");
}
return ;
}
J:
Solved.
考虑 末尾两位为00, 25, 50, 75四种状态
#include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + ; char str[maxn]; int main()
{
while(~scanf("%s", str + ))
{
int ans = INF;
int len = strlen(str + ); //
int tmp1 = -, tmp2 = -;
for(int i = len; i >= ; --i)
{
if(str[i] == '')
{
if(tmp1 == -) tmp1 = len - i;
else if(tmp2 == -)
{
tmp2 = len - i - ;
break;
}
}
}
if(tmp1 != - && tmp2 != -) ans = min(ans, tmp1 + tmp2); //
tmp1 = -, tmp2 = -;
for(int i = len; i >= ; --i)
{
if(str[i] == '')
{
if(tmp1 == -) tmp1 = len - i;
}
if(str[i] == '')
{
if(tmp2 == -) tmp2 = len - i;
}
} if(tmp1 != - && tmp2 != -)
{
if(tmp1 < tmp2)
{
ans = min(ans, tmp1 + tmp2 - );
}
else
{
ans = min(ans, tmp1 + tmp2);
}
} //
tmp1 = -, tmp2 = -;
for(int i = len; i >= ; --i)
{
if(str[i] == '')
{
if(tmp1 == -) tmp1 = len - i;
}
if(str[i] == '')
{
if(tmp2 == -) tmp2 = len - i;
}
} if(tmp1 != - && tmp2 != -)
{
if(tmp1 < tmp2)
{
ans = min(ans, tmp1 + tmp2 - );
}
else
{
ans = min(ans, tmp1 + tmp2);
}
}
//
tmp1 = -, tmp2 = -;
for(int i = len; i >= ; --i)
{
if(str[i] == '')
{
if(tmp1 == -) tmp1 = len - i;
}
if(str[i] == '')
{
if(tmp2 == -) tmp2 = len - i;
}
}
if(tmp1 != - && tmp2 != -)
{
if(tmp1 < tmp2)
{
ans = min(ans, tmp1 + tmp2 - );
}
else
{
ans = min(ans, tmp1 + tmp2);
}
}
if(ans == INF) ans = -;
printf("%d\n", ans);
}
return ;
}
哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级) Solution的更多相关文章
- HUST软件与微电子学院第八届程序设计竞赛-小乐乐下象棋
这题其实很简单,我们可以用一个bfs搜索出所有的,小于k步的,到不同点不同步数的方案数. 我们首先初始化,走到(0,0)点的时候,我们把步数设置为0,但是方法数设置为1,这是因为我们走零步,到一个点, ...
- 哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛) C.Coronavirus (BFS)
题意:有一个图,要求从\(S\)走到\(E\),\(.\)表示可以走的路径,\(*\)周围的八个方向均不能走,要求判断是否能走到\(E\),若能,输出最小路径长度,否则输出\(Impossible\) ...
- ACM-南京理工大学第八届程序设计竞赛-网络赛(2016.04.17)
A.偷吃糖果Time Limit: 1000Ms Memory Limit: 65536KB Description小鱼喜欢吃糖果.他有两盒糖果,两盒糖果分别仅由小写字母组成的字符串s和字符串t构成. ...
- 江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)
链接:https://ac.nowcoder.com/acm/contest/635/H来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 牛客网 江西财经大学第二届程序设计竞赛同步赛 D.绕圈游戏-(跳青蛙游戏)找数的所有因子就可以了
链接:https://ac.nowcoder.com/acm/contest/635/D来源:牛客网 D.绕圈游戏 433为了帮ddd提升智商,决定陪他van特殊的游戏.433给定一个带有n个点的环, ...
- hdu 计算机学院大学生程序设计竞赛(2015’11)
搬砖 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submissi ...
- 计算机学院大学生程序设计竞赛(2015’11)1005 ACM组队安排
1005 ACM组队安排 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pro ...
- 【数论&想法题】小C的问题 @"科林明伦杯"哈尔滨理工大学第八届程序设计竞赛
Time Limit: 1000 MS Memory Limit: 256000 K Description 小C是一个可爱的女孩,她特别喜欢世界上最稳定的图形:三角形.有一天她得到了n根木棍,她把这 ...
- "科林明伦杯"哈尔滨理工大学第八届程序设计竞赛 题解
题目链接 Problems Problem A 快速幂累加即可. #include <cstdio> #include <cstring> #include <iost ...
随机推荐
- Python3 urllib 库
urllib 简介 urllib 基础模块 使用 urllib 发送请求 使用 urllib 构造请求对象 关于 Handler 与 opener 使用 urllib 进行身份验证 使用 urllib ...
- 谷歌Volley网络框架讲解——第一篇
自从公司新招了几个android工程师后,我清闲了些许.于是就可以有时间写写博客,研究一些没来的研究的东西. 今年的谷歌IO大会上,谷歌推出了自己的网络框架——Volley.不久前就听说了但是没有cl ...
- Day04_数据类型占位符使用及进制转换
2013年10月09日 星期三 10时03分51秒 回顾: 1.变量 2.scanf标准函数 字符类型是一种数据类型 在C语言程序中字符类型用char表示 字符类型中包含了256个不同的字符,例如 ...
- {sharepoint}提升 SharePoint 代码执行权限
提升 SharePoint 代码执行权限 关于如何提升 SharePoint 代码执行权限及相关知识介绍的文章我们园子里有很多, 这里给出其中两篇文章的链接,就不再啰嗦了. http://www.cn ...
- Jmeter中ftp测试下载默认路径及文件
今天在测试一个FTP下载功能接口时,发现根据官方文档下载可以成功,但找不到文件,管方文档的配置图如下: 根据官方文档,自己建立了一个请求如下: 但实际下载成功时却发现找不到文件 原来,奥秘是: 本地文 ...
- postgresql----Gist索引
GiST的意思是通用的搜索树(Generalized Search Tree). 它是一种平衡树结构的访问方法,在系统中作为一个基本模版,可以使用它实现任意索引模式.B-trees, R-trees和 ...
- mendeley不能做中文批注的解决方案
mendeley是一个很好用且免费的文献管理工具,但在ubuntu系统下,对文献进行批注无法切换中文输入法,实际上对ibus是支持的,但ibus实在是太难用,大部分ubuntu用户钟爱的还是fcitx ...
- Log4j最简入门及实例
Log4j真的很简单,简单到令人发指的地步.不是要记录日志吗?那就给你一个Log,然后你用Log来写东西就行了,先来一个完整类示例: package test; import org.apache.c ...
- postman app支持浏览器上的cookie
1. 安装postman app 注意要安装postman application(一个应用软件),而不是chrome 插件,打开下面的这个开关 2. chrom浏览器 给chrom浏览器安装pos ...
- iptables综述
1 概述 如下图所示,iptables共有Filter,Nat,Mangle和RAW共四个table,每个table还有若干个chain,每个chain中还包含若干个rule 1.1 Filter t ...