青岛理工大学第五届ACM交流赛 部分题解
A:后缀维护si*pi的最小值,查询的时候二分,判断后缀和当前两个部分就行。
#include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int maxn = ;
int n, m;
LL s[maxn], p[maxn];
LL suf[maxn]; int main() {
// freopen("in", "r", stdin);
int T;
LL q;
scanf("%d", &T);
while(T--) {
scanf("%d%d",&n,&m);
memset(suf, , sizeof(suf));
for(int i = ; i < n; i++) scanf("%lld%lld",&s[i],&p[i]);
suf[n-] = s[n-] * p[n-];
for(int i = n - ; i >= ; i--) suf[i] = min(suf[i+], s[i]*p[i]);
s[n] = 100000000000000LL; suf[n] = 100000000000000LL;
while(m--) {
scanf("%lld", &q);
int pos = lower_bound(s, s+n+, q) - s;
// if(s[pos] == q) printf("%lld\n", q*p[pos]);
if(pos == n) printf("%lld\n", q*p[n-]);
else printf("%lld\n", min(suf[pos], q*p[pos-]));
}
}
return ;
}
B:先离散化找出所有内容的种类,之后尺取卡出最小页数。
#include <bits/stdc++.h>
using namespace std; const int maxn = ;
int n, m, rl, rr;
int h[maxn], p[maxn];
int vis[maxn];
int cnt, ret; int id(int x) {
return lower_bound(h, h+m, x) - h;
} int main() {
// freopen("in", "r", stdin);
while(~scanf("%d", &n)) {
for(int i = ; i < n; i++) {
scanf("%d", &p[i]);
h[i] = p[i];
}
sort(h, h+n); m = unique(h, h+n) - h;
memset(vis, , sizeof(vis));
cnt = ; ret = n; rl = , rr = n - ;
int lo = , hi = ;
while(lo < n) {
while(hi < n && cnt < m) {
int idx = id(p[hi++]);
if(!vis[idx]) cnt++;
vis[idx]++;
}
if(cnt < m) break;
if(ret > hi - lo && cnt == m) {
ret = hi - lo;
rl = lo, rr = hi - ;
}
// printf("%d %d\n", lo, hi);
int idx = id(p[lo++]);
vis[idx]--;
if(vis[idx] == ) cnt--;
if(lo >= n) break;
}
printf("%d\n", ret);
printf("%d %d\n", rl, rr);
}
return ;
}
C:水题…
#include <bits/stdc++.h>
using namespace std; const int maxn = ;
int n;
int a[maxn], b[maxn]; int main() {
// freopen("in", "r", stdin);
int T;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
int x = , y = ;
for(int i = ; i <= n; i++) {
scanf("%d%d",&a[i],&b[i]);
}
sort(a+, a+n+);
sort(b+, b+n+);
for(int i = ; i <= n; i++) {
if(a[i] > b[i]) x += ;
else if(a[i] == b[i]) x++, y++;
else y += ;
}
if(x > y) puts("Winjourn");
else if(x == y) puts("Tie");
else puts("Never_Sorry");
}
return ;
}
D:数位DP,dp(l,cnt)统计长度为l到时候1的个数为cnt的整数。
#include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int maxn = ;
int digit[maxn];
LL dp[maxn][maxn];
LL n; LL dfs(int l, int cnt, bool flag) {
if(l == ) return cnt;
if(!flag && ~dp[l][cnt]) return dp[l][cnt];
int pos = flag ? digit[l] : ;
LL ret = ;
for(int i = ; i <= pos; i++) {
ret += dfs(l-, cnt+(i==), flag&&(pos==i));
}
if(!flag) dp[l][cnt] = ret;
return ret;
} LL f(LL x) {
int pos = ;
while(x) {
digit[++pos] = x % ;
x /= ;
}
return dfs(pos, , true);
} int main() {
// freopen("in", "r", stdin);
int _ = ;
memset(dp, -, sizeof(dp));
while(~scanf("%lld", &n)) {
printf("Case %d:%lld\n", _++, f(n));
}
return ;
}
E:模拟,如果循环节正好长度为50的话,就不要打省略号了。。
#include <bits/stdc++.h>
using namespace std; vector<int> t1, t2;
map<int, int> id;
int a, b; void f(int a, int b) {
id.clear();
t1.clear(); t2.clear();
int p = -;
while() {
t1.push_back(a/b);
int x = a % b;
if(x == ) break;
if(id.find(x) == id.end()) {
id[x] = t2.size();
t2.push_back(x);
}
else {
p = id[x];
break;
}
a = x * ;
}
if(t1.size() == ) while();
printf("%d.", t1[]);
bool flag = ;
bool plusflag = ;
int cnt = ;
for(int i = ; i < t1.size(); i++) {
if(cnt >= ) {
plusflag = ;
break;
}
if(i == p + ) {
printf("(");
flag = ;
}
printf("%d", t1[i]);
if(flag) cnt++;
}
if(plusflag) printf("...");
if(p >= ) {
if(flag) printf(")\n");
printf("%d\n", t1.size()-p-);
}
else {
printf("(0)\n");
printf("1\n");
}
} int main() {
// freopen("in", "r", stdin);
// freopen("out", "w", stdout);
int _ = ;
while(~scanf("%d%d",&a,&b)) {
printf("Case %d:\n%d/%d=", _++, a, b);
if(a % b == ) printf("%d.(0)\n1\n", a / b);
else f(a, b);
}
return ;
}
F:好麻烦的计算几何,感觉要先卡出封闭图形,之后找到所有的矩形。然后看看能放的最大圆。
G:对整个数组排序后二分答案,贪心地从左到右选取数字,保证相邻两个数的差不小于二分出来的值,判断是否满足大于等于k个。
#include <bits/stdc++.h>
using namespace std; const int maxn = ;
int n, k;
int a[maxn], s[maxn];
int ret; bool ok(int dis) {
int i = , p = ;
int cnt = ;
while(i <= n) {
if(a[i] - a[p] >= dis) {
p = i; i++;
cnt++;
}
else i++;
}
return cnt + >= k;
} int main() {
// freopen("in", "r", stdin);
while(~scanf("%d%d",&n,&k)) {
memset(s, , sizeof(s));
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
sort(a+, a+n+);
ret = a[n] - a[];
int lo = , hi = a[n];
while(lo <= hi) {
int mid = (lo + hi) >> ;
if(ok(mid)) {
ret = mid;
lo = mid + ;
}
else hi = mid - ;
}
printf("%d\n", ret);
}
return ;
}
H:像是需要用启发式搜索将整座附近的点处理出来一个优先值,顺着第一条路走,最后回来。(后来有巨巨说是BFS)
I:枚举a,b字符串子串的起始,扫描对应位,如果不相同则替换至相同,最多k次操作。贪心地将替换操作放到前面,如果不能替换则break更新ret。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <map>
using namespace std; const int maxn = ;
int n, m, k;
char a[maxn], b[maxn]; int main() {
// freopen("in" ,"r", stdin);
while(~scanf("%d", &k)) {
scanf("%s%s",a,b);
n = strlen(a); m = strlen(b);
int ret = ;
for(int i = ; i < n; i++) {
for(int j = ; j < m; j++) {
int cnt = , tmp = ;
for(int aa = i, bb = j; aa < n && bb < m; aa++, bb++) {
if(a[aa] == b[bb]) tmp++;
else {
if(cnt < k) tmp++, cnt++;
else break;
}
}
ret = max(ret, tmp);
}
}
printf("%d\n", ret);
}
return ;
}
J:f(i,j)表示和为i,用j个数字组成的方案数,转移方程f(i,j)=f(i-p,j-1),p取1~4,会爆LL所以用double存了f。
#include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int maxn = ;
const int maxm = ;
int n, m;
double f[maxn][maxm]; int main() {
// freopen("in", "r", stdin);
memset(f, , sizeof(f));
f[][] = 1.0; f[][] = 1.0; f[][] = 1.0; f[][] = 1.0;
for(int i = ; i < maxn; i++) {
for(int j = ; j < maxm; j++) {
for(int k = ; k <= ; k++) {
if(k >= j) continue;
f[i][j] += f[i-][j-k];
}
}
}
while(~scanf("%d%d",&n,&m)) {
printf("%.4lf\n", f[n][m]/pow(,n));
}
return ;
}
K:最后的情形无非是两种,一种是wywy..,另一种是ywyw..。整个串长度如果是奇数那么是无法围成要求的项链的;之后判断当前情况和上述哪种情况最近,然后分别找w和y错位的数量,先交换,再修改,min(w,y)+(max(w,y)-min(w,y))=max(w,y)即为答案。
#include <bits/stdc++.h>
using namespace std; const int maxn = ;
char s[maxn], t[][maxn];
int n; int main() {
// freopen("in", "r", stdin);
memset(t, , sizeof(t));
for(int i = ; i < maxn; i++) {
if(i % == ) {
t[][i] = 'w', t[][i] = 'y';
}
else {
t[][i] = 'y', t[][i] = 'w';
}
}
while(~scanf("%d", &n)) {
scanf("%s", s);
if(n & ) {
puts("What a pity!");
continue;
}
int a = , b = ;
for(int i = ; i < n; i++) {
if(s[i] != t[][i]) a++;
if(s[i] != t[][i]) b++;
}
if(a < b) {
int w = , y = ;
for(int i = ; i < n; i++) {
if(s[i] != t[][i]) {
if(s[i] == 'w') w++;
else y++;
}
}
printf("%d\n", max(w, y));
}
else {
int w = , y = ;
for(int i = ; i < n; i++) {
if(s[i] != t[][i]) {
if(s[i] == 'w') w++;
else y++;
}
}
printf("%d\n", max(w, y));
}
}
return ;
}
L:不会…
青岛理工大学第五届ACM交流赛 部分题解的更多相关文章
- 记:青岛理工ACM交流赛筹备工作总结篇
这几天筹备青岛理工ACM交流赛的过程中遇到了不少问题也涨了不少经验.对非常多事也有了和曾经不一样的看法, 一直在想事后把这几天的流水帐记一遍,一直没空直到今天考完C++才坐下来開始动笔.将这几天的忙 ...
- 青岛理工ACM交流赛 J题 数格子算面积
数格子算面积 Time Limit: 1000MS Memory limit: 262144K 题目描述 给你一个多边形(用’\’和’/’表示多边形的边),求多边形的面积. 输入 第一行两个正整数h ...
- 2014山东省“浪潮杯”第五届ACM省赛总结
一次比赛做一次总结,弱菜又来总结了…… 我这种大四的又死皮赖来混省赛了,貌似就我和山大威海的某哥们(不详其大名)了吧.颁奖前和他聊天,得知他去百度了,真是不错,ORZ之. 比赛流水账: 题目目前不知道 ...
- ACM交流赛感悟
A题很水,字符串匹配,提交好几次都没通过,后来老何提醒后,发现题意理解错了,改过来之后,还是没过----------------在敲代码之前,一定要三个人统一一下思路,思路一样的话,开敲: F题是简单 ...
- 山东省第五届ACM省赛
题目链接:http://acm.sdut.edu.cn/sdutoj/contest_show.php?contest_id=1449 相关总结:http://www.cnblogs.com/mcfl ...
- 青岛理工交流赛 H题 素数间隙
13110581088注销 素数间隙 Time Limit: 1000MS Memory limit: 262144K 题目描述 Neko猫是一个很喜欢玩数字游戏的会说话的肥猫,经常会想到很多很好玩的 ...
- 第六届acm省赛总结(退役贴)
前言: 这是我的退役贴,之前发到了空间里,突然想到也要在博客里发一篇,虽然我很弱,但是要离开了还是有些感触,写出来和大家分享一下,希望不要见笑.回来看看,这里也好久没有更新了,这一年确实有些懈怠,解题 ...
- Wannafly交流赛1_B_硬币【数学】
Wannafly交流赛1_B_硬币[数学] 链接:https://www.nowcoder.com/acm/contest/69/B 来源:牛客网 题目描述 蜥蜴的生日快到了,就在这个月底! 今年,蜥 ...
- Wannafly交流赛1 _A_有理数 【水】
Wannafly交流赛1 A有理数 [水] 链接:https://www.nowcoder.com/acm/contest/69/A 来源:牛客网 题目描述 有一个问题如下: 给你一个有理数v,请找到 ...
随机推荐
- 【linux】自定义配置debian+openbox
openbox确实是好东西阿,小巧,不开iceweasel时内存总使用量不到200M,功能又强大,不过限于我是菜鸟,openbox再强大也有限...debian装openbox是及其简单的,不过为了使 ...
- Servlet工作原理(转)
Servlet运行在Servlet容器中,由容器负责Servlet实例的查找及创建工作,并按照Servlet规范的规定调用Servlet的一组方法,这些方法也叫生命周期的方法.具体调用过程如下图所示: ...
- V4L2读取摄像头程序流程【转】
本文转载自:https://my.oschina.net/u/1024767/blog/210801 v4l2 操作实际上就是 open() 设备, close() 设备,以及中间过程的 ioctl( ...
- Linux计划任务,自动删除n天前的旧文件【转】
转自:http://blog.csdn.net/jehoshaphat/article/details/51244237 转载地址:http://yaksayoo.blog.51cto.com/510 ...
- 8.1:SportsStore:Orders and Administration
本章,作者将通过收集和验证购物明细,来完成SportsStore应用,并在Deployd服务器上存储该订单.作者也构建了一个管理应用,允许认证用户查看订单,和管理产品分类. 1.准备实例项目 2.获取 ...
- AJAX 数据库实例
AJAX 用于创建动态性更强的应用程序. AJAX ASP 实例 下面的例子将演示当用户在输入框中键入字符时,网页如何与服务器进行通信: 实例 请在下面的输入框中键入字母(A - Z): 姓名: 建议 ...
- Ecshop后台订单列表增加”商品名”检索字段
近期ecshop网站做活动,统计商品订单量的时候没有按商品名搜索的选项,只能手动查询.这样效率很低下,而且容易出错. 现在为列表增加一个简单的“按商品名搜索”表单项.效果如下图 涉及到2个文件,分别是 ...
- postgresql 关闭自动提交
1. 简介说明 我们知道oracle中sqlplus里面执行dml语句:是需要提交commit:若错了:也可以回滚rollback: 然而在postgresql里面默认是自动提 ...
- listview实现点击条目上的箭头展开隐藏菜单。
效果如下图,当点击listview中的小三角时,显示出下面布局,再点隐藏, 点击其他条目的三角时,上一个展开的条目隐藏的同时展开当前条目. 思路是在item布局中放入展开菜单的布局,并设置状态为隐藏, ...
- [HTML]DIV+CSS 文字垂直居中
在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中 ...