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. 详解Android AM命令

    1.简介 在Android中,我们除了从界面上启动程序之外,还可以从命令行启动程序,如使用命令行工具am. am全称activity manager,是Android下非常实用命令,其代码在frame ...

  2. .container_fluid 与 .container 的区别

    .container 会在左右两侧留白边,而且是自动的,不用设置. .container{ padding-right:15px; padding-left:15px; margin-right:au ...

  3. Openstack的HA解决方案【替换原有的dashboard】

    0. 进入到/etc/haproxy/conf.d/目录下 mv 015-horizon.cfg 150-timaiaas.cfg 将原有的dashboard的ha配置文件做为自己的配置文件. 1. ...

  4. linux常用命令简单介绍(netstat,awk,top,tail,head,less,more,cat,nl)

    1.netstat netstat -tnl | grep 443 (查看443端口是否被占用) root用户,用netstat -pnl | grep 443 (还可显示出占用本机443端口的进程P ...

  5. java总结第二次//数组及面向对象

    三.java数组 主要内容:数组概述.一维数组声明.数组元素的引用.数组元素的默认初始化.创建数组.数组初始化.多维数组.多维数组初始化.数组排序 1.数组概述 数组是多个相同类型数据的组合,实现对这 ...

  6. HAL中通过JNI调用java方法【转】

    转载请注明本文出处:http://www.cnblogs.com/xl19862005 作者:Xandy 由于工作的需要,最近一直在研究HAL.JNI.Java方法之间互调的问题,并做了如下一些记录和 ...

  7. C#操作CSV存取类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  8. 严重: IOException while loading persisted sessions: java.io.EOFException

    tomcat在启动时出现如下异常问题: 严重: IOException while loading persisted sessions: java.io.EOFException 严重: Excep ...

  9. CalParcess.php.

    <?php require_once "OperSerVice.class.php"; //接受三个数 //isset if(!isset($_REQUEST['NUM1'] ...

  10. jquery与服务器交换数据的利器--ajax(异步javascript and xml)

    load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 一.下面的例子把 "demo_test.txt" 文件中 id="p1" 的元素的内容,加载 ...