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. sql语句删除数据表重复字段的方法

    大家都可能遇到字段重复的情况,网上很多人在找方法,也给出了一些方法,但是有的方法是误导大家,铁牛写出以下方法,方便大家使用 1.通过group by把重复的字段筛选出来,并建立临时表tmp 1 cre ...

  2. location.reload()加载时有弹出框

    解决办法: 1.试试 window.location.href=window.location.href 2.当前页有被post数据的时候reload就会提示刷新 可以尝试重新定向页面地址 3.rel ...

  3. z/os上的tar和gzip(2)

    前一篇文章写过了如何合成并压缩大批量文件,这篇文章解释一下如何在拿到压缩文件后如何解压并还原大批量文件.   解压缩的JCL很简单,如下所示,和压缩的JCL类似,只要把参数改成UNPACK,然后设置一 ...

  4. RAID、软RAID和硬RAID

    RAID(redundant array of inexpensive disks):独立的硬盘冗余阵列,基本思想是把多个小硬盘组合在一起成为一个磁盘组,通过软件或硬件的管理达到性能提升或容量增大或增 ...

  5. Watir资源列表【转】

    Watir简介 "Watir" (发音与 water相近) 全写是 "Web Application Testing in Ruby".Watir是一款用Rub ...

  6. Oracle 11g 在备份导出时缺少表的问题

    ORACLE 11G中有个新特性,当表无数据时,不分配segment,以节省空间. 解决方法: 1)insert一行,再rollback就产生segment了 该方法是在在空表中插入数据,再删除,则产 ...

  7. 前后台数据传输两种方式:servlet、Controller

    1.Servlet: 1.1从jsp页面跳转到Servlet控制器中,通过request.getParameter()来获取参数. 1.2// 把注册成功的用户对象保存在session中       ...

  8. 怎样用PHP制作验证码呢?

    生成验证码无非就那么几个步骤,首先是获取一个随机字符串,然后创建一个布画,将生成的字符串写到布画上,我们还可以在布画上画线画雪花,现在帖一段生成验证码的代码. 源代码: <?phpsession ...

  9. discuz阅读权限的设置作用

    为什么要有阅读权限?偶想很多新手有这个疑问吧,所以特开此帖说明下. 阅读权限的设置是帖子作者为了部分限制帖子的读者群.虽然网上发帖重在分享,但帖子(尤其精华帖子)是作者花时间和经历而写成的,不加阅读权 ...

  10. postgresql压力测试工具用法以及参数解读

    pgbench是PostgreSQL自带的一个数据库压力测试工具, 支持TPC-B测试模型, 或自定义测试模型. 自定义测试模型支持元命令, 调用shell脚本, 设置随机数, 变量等等. 支持3种异 ...