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的更多相关文章

  1. HUST软件与微电子学院第八届程序设计竞赛-小乐乐下象棋

    这题其实很简单,我们可以用一个bfs搜索出所有的,小于k步的,到不同点不同步数的方案数. 我们首先初始化,走到(0,0)点的时候,我们把步数设置为0,但是方法数设置为1,这是因为我们走零步,到一个点, ...

  2. 哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛) C.Coronavirus (BFS)

    题意:有一个图,要求从\(S\)走到\(E\),\(.\)表示可以走的路径,\(*\)周围的八个方向均不能走,要求判断是否能走到\(E\),若能,输出最小路径长度,否则输出\(Impossible\) ...

  3. ACM-南京理工大学第八届程序设计竞赛-网络赛(2016.04.17)

    A.偷吃糖果Time Limit: 1000Ms Memory Limit: 65536KB Description小鱼喜欢吃糖果.他有两盒糖果,两盒糖果分别仅由小写字母组成的字符串s和字符串t构成. ...

  4. 江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)

    链接:https://ac.nowcoder.com/acm/contest/635/H来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  5. 牛客网 江西财经大学第二届程序设计竞赛同步赛 D.绕圈游戏-(跳青蛙游戏)找数的所有因子就可以了

    链接:https://ac.nowcoder.com/acm/contest/635/D来源:牛客网 D.绕圈游戏 433为了帮ddd提升智商,决定陪他van特殊的游戏.433给定一个带有n个点的环, ...

  6. hdu 计算机学院大学生程序设计竞赛(2015’11)

    搬砖 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submissi ...

  7. 计算机学院大学生程序设计竞赛(2015’11)1005 ACM组队安排

    1005 ACM组队安排 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Pro ...

  8. 【数论&想法题】小C的问题 @"科林明伦杯"哈尔滨理工大学第八届程序设计竞赛

    Time Limit: 1000 MS Memory Limit: 256000 K Description 小C是一个可爱的女孩,她特别喜欢世界上最稳定的图形:三角形.有一天她得到了n根木棍,她把这 ...

  9. "科林明伦杯"哈尔滨理工大学第八届程序设计竞赛 题解

    题目链接  Problems Problem A 快速幂累加即可. #include <cstdio> #include <cstring> #include <iost ...

随机推荐

  1. Spring装配Bean的过程

    首先说一个概念:“懒加载” 懒加载:就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中. spring配置文件中be ...

  2. 第五篇:浅谈CPU 并行编程和 GPU 并行编程的区别

    前言 CPU 的并行编程技术,也是高性能计算中的热点,也是今后要努力学习的方向.那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为将来深入学习 CPU 并行编程技术打下铺 ...

  3. Android性能优化的一些方案

    优化Dalvik虚拟机的堆内存分配 1)首先内存方面,可以参考 Android堆内存也可自己定义大小和优化Dalvik虚拟机的堆内存分配 对于Android平台来说,其托管层使用的Dalvik Jav ...

  4. php 升级后 htmlspecialchars 返回空 的解决方案

    今天将php版本升级到5.3.0以上(我升级到php5.4.13)的版本后发现一个问题 htmlspecialchars 函数返回为空.查了资料后,发现新版本对htmlspecialchars这个函数 ...

  5. 【java】将List中的实体按照某个字段进行分组的算法

    如何将List中存放的实体按照某个字段进行分组呢?来看看下面的例子,假如实体中有个字段叫批次号,我们将具有相同批次号的实体放在一起,那么怎么实现呢?看下面的代码: 可以定义个Map,Map的key用于 ...

  6. 点击button,button背景图片变化

    1.设置背景渐变效果,在drawable目录下建buttonshape.xml文件, 内容为: <?xml version="1.0" encoding="utf- ...

  7. 【linux系列】vi模式下查找和替换

    一.查找 1.查找命令 /pattern<Enter> :向下查找pattern匹配字符串 ?pattern<Enter> :向上查找匹配字符串 在使用了查找命令之后,使用如下 ...

  8. 2012Noip提高组Day2 T3 疫情控制

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到 ...

  9. Android 微信分享,分享到朋友圈与分享到好友,以及微信登陆

    extends:http://www.cnblogs.com/android100/p/Android-qq.html 一.申请你的AppID http://open.weixin.qq.com/ 友 ...

  10. 【事件流】浅谈事件冒泡&&事件捕获------【巷子】

    首先在扯淡的时候我们需要先了解一个东西,这个东西就是事件流. 1.什么是事件流? 解释:当一个HTML元素触发一个事件处理函数的时候,该事件会在该元素节点到根节点之间传播,传播路径所经过的节点都会接受 ...