哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级) 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 ...
随机推荐
- Dubbo(一) -- 初体验
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架. 一.Dubbo出现的背景 随着互联网的发展,网站应用的规模不断扩大,常规的 ...
- memset和memcpy函数、atoi函数
memset void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c.如下: // 1.将已开辟内存空间s的首n个字节 ...
- BUG:给Nexus7编译Android4.2的时候出现 fatal error: map: No such file or directory
情况是这样的,某人最近入手一台nexus7,于是在cyanogenmod 将nexus7的原代码下载到本地,编译环境是UBUNTU 12,04 然后编译的时候,出现了如下的错误导致编译失败 <p ...
- php应该在何时调用mysql_close() ,可能和中断请求有关
关于php应该在何时调用mysql_close()以及pconnect方式和传统方式有何种区别收藏 以前我一直认为,当php的页面执行结束时,会自动释放掉一切.相信很多人都跟我想的一样.但事实证明并不 ...
- img-图片二进制流 64位前端显示
碰到的场景:因为使用iframe子窗口打开,多张的二维码图片创建方法调用,导致页面打开缓慢, 所以将调取方式转换成<img src="data:image/png;base64,@it ...
- 【PHP】 php实现字符串反转:支持中英文
strrev 函数对英文很好用,直接可以实现字符串翻转 但是面对中文呢?肯定都是乱码,对于这样的问题有很多,比如strstr,substr等函数都是这样的. PHP提供了mb_类的函数实现不同编码. ...
- Window PHP 使用命令行模式
电脑系统: win7 php环境: phpstudy 1 把php目录放到环境变量path下面: 我的电脑->属性->高级->环境变量->系统变量->Path->编 ...
- bootstrap之表单
一.表单布局 向父 <form> 元素添加 role="form". 把标签和控件放在一个带有 class .form-group 的 <div> 中.这是 ...
- 【Android】Android--Dialog
前言 对话框对于应用也是必不可少的一个组件,在Android中也不例外,对话框对于一些提示重要信息,或者一些需要用户额外交互的一些内容很有帮助.本篇博客就讲解一下Android下对话框的使用,在本篇博 ...
- Linux系统下 Rsync 环境安装搭建
一.Rsync简介 1.认识 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.Rsync使用所谓的“Rsync算法”来使本地和远 ...