题目链接:https://vjudge.net/contest/148543#overview。

  A题:n个罪犯,每个人有一个犯罪值,现在要从里面选出连续的c个人,每个人的犯罪值都不能超过t,问选法的种类数。O(n)xjbg一下即可:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
const int N = + ;
typedef long long ll;
typedef pair<int,int> pii; int a[N]; int main()
{
int n,t,c;
cin >> n >> t >> c;
ll ans = ;
int cnt = ;
for(int i=;i<=n;i++)
{
int temp;scanf("%d",&temp);
if(temp <= t) cnt++;
else
{
if(cnt >= c) ans += cnt - c + ;
cnt = ;
}
}
if(cnt >= c) ans += cnt - c + ;
cout << ans << endl;
return ;
}

A

  B题:n个数字,从中选出不重叠的k段数字,每段的长度都为m,问最大的和。因为n是5000,所以很明显的开个二维数组n方dp一下即可:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
const int N = + ;
typedef long long ll;
typedef pair<int,int> pii; ll pre[N];
ll dp[N][N]; int main()
{
int n,m,k;
cin >> n >> m >> k;
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
pre[i] = pre[i-] + x;
}
for(int i=m;i<=n;i++)
{
for(int j=;j<=k;j++)
{
dp[i][j] = max(dp[i-][j], dp[i-m][j-] + pre[i] - pre[i-m]);
}
}
cout << dp[n][k] << endl;
return ;
}

B

  

  C题:给一个距离矩阵,问是否可能构成一棵树。做法是克鲁斯卡尔以后dfs一遍看看距离矩阵是否相等即可。仔细想想还是挺妙的。代码如下(写的有点挫):

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
const int N = + ;
typedef long long ll;
typedef pair<int,int> pii; int root[N],cnt,vis[N],last[N];
int n,G[N][N],d[N][N];
vector<pii> graph[N];
void init() {for(int i=;i<=n;i++) root[i] = i;}
int find(int x) {return x == root[x] ? x : root[x] = find(root[x]);}
void connect(int x,int y,int w)
{
int rx = find(x);
int ry = find(y);
if(rx != ry)
{
root[rx] = ry;
//d[x][y] = d[y][x] = w;
graph[x].push_back(pii(y,w));
graph[y].push_back(pii(x,w));
cnt--;
}
}
struct edge
{
int u,v,w;
bool operator < (const edge & temp) const
{
return w > temp.w;
}
}; void dfs(int u,int fa)
{
for(int i=;i<graph[u].size();i++)
{
pii p = graph[u][i];
int v = p.first;
int w = p.second;
if(v == fa) continue;
last[v] = last[u] + w;
dfs(v,u);
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
scanf("%d",&G[i][j]);
if(i == j && G[i][j]) return *puts("NO");
}
}
for(int i=;i<=n;i++) for(int j=;j<=n;j++) if(G[i][j] != G[j][i] || i!=j && G[i][j] == ) return *puts("NO");
priority_queue<edge> Q;
for(int i=;i<=n;i++)
{
for(int j=;j<i;j++)
{
Q.push((edge){i,j,G[i][j]});
}
}
cnt = n; init();
for(;cnt > ;)
{
edge e = Q.top();Q.pop();
connect(e.u, e.v, e.w);
}
//for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) printf("%d%c",d[i][j],j==n?'\n':' ');
for(int i=;i<=n;i++)
{
last[i] = ;
dfs(i,-);
for(int j=;j<=n;j++)
{
if(j == i) continue;
if(last[j] != G[i][j]) return *puts("NO");
}
}
puts("YES");
return ;
}

C

  D题:给两个部分的字符串,分别重复n次和m次(最终长度相等),问有多少位置字符是不同的。只需要比较一个lcm里面的长度是肯定的,但暴力做肯定T。一个lcm中,考虑到只有pos%gcd这些位置需要比较。那么就可以线性的做出来了。最后扩大相应倍数即可。代码如下:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
const int N = + ;
typedef long long ll;
typedef pair<int,int> pii; ll n,m;
char a[N],b[N];
int vis[N][]; int main()
{
cin >> n >> m;
scanf("%s%s",a+,b+);
int lena = strlen(a+);
int lenb = strlen(b+);
int g = __gcd(lena,lenb);
ll lcm = (ll)lena / g * lenb;
ll ans = ;
for(int i=;i<=lena;i++) vis[i%g][a[i]-'a']++;
for(int i=;i<=lenb;i++) ans += vis[i%g][b[i]-'a'];
cout << 1LL*lena * n / lcm * (lcm - ans) << endl;
return ;
}

D

  E题,看了一会没怎么明白题意,暂时放过吧。

2017 ZSTU寒假排位赛 #4的更多相关文章

  1. 2017 ZSTU寒假排位赛 #7

    题目链接:https://vjudge.net/contest/149498#overview. A题,水题,直接按照题意模拟一下即可. B题,我用的是线段树.大力用的差分标记(上次听zy说过,下次再 ...

  2. 2017 ZSTU寒假排位赛 #1

    题目链接:https://vjudge.net/contest/147102#overview. A题:给出一堆的点,要找出两条垂直的直线,一条与x轴呈45度.-->使得所有的点到任意一条直线的 ...

  3. 2017 ZSTU寒假排位赛 #2

    题目链接:https://vjudge.net/contest/147632#overview. A题,状态压缩一下然后暴力即可. B题,水题,略过. C题,有负数,前缀和不是单调的,因此不能用尺取法 ...

  4. 2017 ZSTU寒假排位赛 #8

    题目链接:https://vjudge.net/contest/149845#overview. A题,水题. B题,给出 p个 第一个人的区间 和 q个第二个人的区间,问[l,r]中有多少个整数满足 ...

  5. 2017 ZSTU寒假排位赛 #6

    题目链接:https://vjudge.net/contest/149212#overview. A题,水题,略过. B题,水题,读清题意即可. C题,数学题,如果把x表示成x=nb+m,则k=n/m ...

  6. 2017 ZSTU寒假排位赛 #5

    题目链接:https://vjudge.net/contest/148901#overview. A题,排序以后xjbg即可. B题,弄个数组记录当前列是不是删除以及当前行是不是已经大于下一行然后乱搞 ...

  7. 2017 ZSTU寒假排位赛 #3

    题目链接:https://vjudge.net/contest/147974#overview. A题,费用流,不会..跳过了. B题,给一个图,问至少添加几条边能成为强连通图.显然缩点,要使得成为一 ...

  8. Codeforces Round #341 (Div. 2)

    在家都变的懒惰了,好久没写题解了,补补CF 模拟 A - Wet Shark and Odd and Even #include <bits/stdc++.h> typedef long ...

  9. 2017杭电ACM集训队单人排位赛 - 6

    2017杭电ACM集训队单人排位赛 - 6 排名 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 59 1 X X 1 1 X X 0 1 ...

随机推荐

  1. Windows编程 鼠标

    客户区鼠标消息 由上一回我们得知Windows只把键盘消息发送给拥有输入焦点的窗口,而鼠标消息与此不同:只要鼠标跨越窗口或者在某窗口下按下鼠标键,那么窗口过程就会收到鼠标消息,不管该窗口是否活动或者是 ...

  2. 使用Vue CLI脚手架搭建vue项目

    本次是使用@vue/cli 3.11.0版本搭建的vue项目 1. 首先确保自己的电脑上的Node.js的版本是8.9版本或者以上 2. 全局安装vue/cli npm install @vue/cl ...

  3. 函数——es6函数扩展(二)

    一.声明 1. let(变量) 可以只声明不给值(默认为undefined),或者是先声明后给值,但是必需声明后再使用,可以重复赋值,可以防止变量泄露: 同一作用域里不能重复的声明,不同作用域里可以, ...

  4. php 限制标题长度,将一个中文转换成一个字符

    点击链接加入群[php/web 学习课堂]:https://jq.qq.com/?_wv=1027&k=5UJ9vEa 欢迎大家加入,一起讨论学习 玩这个功能的时候,我们要注意一点,我们是用中 ...

  5. split分离特殊字符

    Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ ) \b  \t  \n  \f  \r  \ ...

  6. DX使用随记--其他

    1.  百分号显示格式 百分号:{0:P}表示显示为百分号模式.如数据源中为0.5.表示出来为50%

  7. echo打印换行

    shell环境中,echo是常用的数据命令,但有的时候,想通过“\n”使输出换行却换不了,这个时候需要增加-e选项: $ echo "Hellow.\nHey man~" Hell ...

  8. Notepad++快捷键及使用技巧

    常用快捷键: CTRL+Q 注释/取消注释 用Notepad++写代码,要是有一些重复的代码想copy一下,还真不容易,又得动用鼠标,巨烦人....有木有简单的方法呢,确实还是有的不过也不算太好用.主 ...

  9. 【Git】四、本地Git的工作原理

    一.工作区 第一篇创建版本库讲的有些笼统,这里详细区分一下各个概念 在第一篇我们创建了一个文件夹GitRepo,但其实这个文件夹本身并不是版本库,只是我们的工作区.我们所有的文件创建和修改都在这里执行 ...

  10. 在DjangoAdmin中使用KindEditor(上传图片)

    一.下载 http://kindeditor.net/down.php 删除asp.asp.net.php.jsp.examples文件夹 拷贝到static目录下 二.配置 kindeditor目录 ...