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交流赛 部分题解的更多相关文章

  1. 记:青岛理工ACM交流赛筹备工作总结篇

    这几天筹备青岛理工ACM交流赛的过程中遇到了不少问题也涨了不少经验.对非常多事也有了和曾经不一样的看法, ​一直在想事后把这几天的流水帐记一遍,一直没空直到今天考完C++才坐下来開始动笔.将这几天的忙 ...

  2. 青岛理工ACM交流赛 J题 数格子算面积

    数格子算面积 Time Limit: 1000MS Memory limit: 262144K 题目描述 给你一个多边形(用’\’和’/’表示多边形的边),求多边形的面积. 输入  第一行两个正整数h ...

  3. 2014山东省“浪潮杯”第五届ACM省赛总结

    一次比赛做一次总结,弱菜又来总结了…… 我这种大四的又死皮赖来混省赛了,貌似就我和山大威海的某哥们(不详其大名)了吧.颁奖前和他聊天,得知他去百度了,真是不错,ORZ之. 比赛流水账: 题目目前不知道 ...

  4. ACM交流赛感悟

    A题很水,字符串匹配,提交好几次都没通过,后来老何提醒后,发现题意理解错了,改过来之后,还是没过----------------在敲代码之前,一定要三个人统一一下思路,思路一样的话,开敲: F题是简单 ...

  5. 山东省第五届ACM省赛

    题目链接:http://acm.sdut.edu.cn/sdutoj/contest_show.php?contest_id=1449 相关总结:http://www.cnblogs.com/mcfl ...

  6. 青岛理工交流赛 H题 素数间隙

    13110581088注销 素数间隙 Time Limit: 1000MS Memory limit: 262144K 题目描述 Neko猫是一个很喜欢玩数字游戏的会说话的肥猫,经常会想到很多很好玩的 ...

  7. 第六届acm省赛总结(退役贴)

    前言: 这是我的退役贴,之前发到了空间里,突然想到也要在博客里发一篇,虽然我很弱,但是要离开了还是有些感触,写出来和大家分享一下,希望不要见笑.回来看看,这里也好久没有更新了,这一年确实有些懈怠,解题 ...

  8. Wannafly交流赛1_B_硬币【数学】

    Wannafly交流赛1_B_硬币[数学] 链接:https://www.nowcoder.com/acm/contest/69/B 来源:牛客网 题目描述 蜥蜴的生日快到了,就在这个月底! 今年,蜥 ...

  9. Wannafly交流赛1 _A_有理数 【水】

    Wannafly交流赛1 A有理数 [水] 链接:https://www.nowcoder.com/acm/contest/69/A 来源:牛客网 题目描述 有一个问题如下: 给你一个有理数v,请找到 ...

随机推荐

  1. 【和小强学移动app测试2】移动终端app测试点归纳(持续更新)

      以下所有测试最后必须在真机上完整的执行 1.安装.卸载测试 在真机上的以及通过91等第三方的安装与卸载 安装在手机上还是sd卡上 2.启动app测试 3.升级测试 数字签名.升级覆盖安装.下载后手 ...

  2. android实操--练习1

    这两天有空,打算把一些文档整理一下,快要考试了,找一些简单的例子来做做,重温安卓的知识. 下面是第一个练习: 实现很简单,下面我们来看看: 首先新建一个安卓项目Demo1 接着是界面的布局(包括act ...

  3. selenium验证码处理

    在爬虫过程中经常遇到验证码,如何处理验证码就显得很重要 现在来说貌似没有完美的解决方案,很多都是通过第三方平台来实现验证码的验证 将获取的验证码的url发送到第三方平台,接收平台返回的验证码,貌似很简 ...

  4. 一小时学会Markdown写作

    写作也是创作一件产品.以易懂.简洁.凝练的方式表达观点.阐述见解和知识,发挥影响力. 为什么要使用 Markdown 博文迁移的排版兼容.当在多个博客之间,或者在线博客与本地笔记软件之间迁移的时候,排 ...

  5. datasnap 的线程池(转)

    datasnap的线程池 新的datasnap使用INDY10的线程池.不管你知不知道,DATASNAP都是使用线程池了,这和MIDAS不同,MIDAS默认是没有线程池的. 跟踪INDY10线程池类T ...

  6. 程序员PC选购

    程序员PC选购[转载] http://www.cnblogs.com/legendtao/p/4631150.html 好马配上好鞍,自然事半功倍.一台好的PC能给你更好的工作娱乐体验~~(卧槽,感觉 ...

  7. lz: linux ls 变种 只显示大小和名称(包括目录)

    本次输入法使用: 手心输入法 for Mac 1.0版 测试环境为:Ubuntu 14.14.2 LTS updates 测试时间为:2015年5月28日,感觉死亡将至的夜晚,独自一人坐在一个角落,戴 ...

  8. 自定义tableViewCell

    http://my.oschina.net/joanfen/blog/137601 效果如下图:可触发按钮事件 1.创建一个Empty Application 2.新建一个TableViewContr ...

  9. NSScanner用法详解

    NSScanner类用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串.可以在创建NSScaner时指定它的string属性,然后scanner会按照你的要求从头到尾地扫描这个字符 ...

  10. 20145227 《Java程序设计》实验四实验报告

    20145227 <Java程序设计>实验四实验报告 实验内容 安装Andriod Studio并配置软件 使用Andriod Studio软件实现Hello World的小程序 实验步骤 ...