A:题意:你有一个1 * n的网格,有些地方是障碍。你有两个人,分别要从a到b和从c到d,一次只能向右跳1步或者两步。求是否可行。

解:先判断有没有2个连续的障碍,然后判断是否能错车。

 #include <bits/stdc++.h>

 const int N = ;

 char str[N];

 int main() {
int n, a, b, c, d;
scanf("%d%d%d%d%d", &n, &a, &b, &c, &d);
scanf("%s", str + );
if(c < d) {
for(int i = a; i < d; i++) {
if(str[i] == '#' && str[i + ] == '#') {
printf("No\n");
return ;
}
}
printf("Yes\n");
return ;
}
else {
for(int i = a; i < c; i++) {
if(str[i] == '#' && str[i + ] == '#') {
printf("No\n");
return ;
}
}
for(int i = b; i <= d; i++) {
if(str[i - ] == '.' && str[i] == '.' && str[i + ] == '.') {
printf("Yes\n");
return ;
}
}
printf("No\n");
return ;
}
return ;
}

AC代码

B:题意:你有一个ABC字符串,你能进行的操作就是把某个ABC变成BCA。求最多进行多少次操作。

解:发现可以把BC看做一个整体。单独的B和C看做障碍物。

那么对于每一段无障碍物的连续A,BC,求逆序对就好了。

 #include <bits/stdc++.h>

 typedef long long LL;
const int N = ; char str[N];
bool vis[N]; int main() { scanf("%s", str + );
int n = strlen(str + );
for(int i = ; i <= n; i++) {
if(str[i] == 'C' && str[i - ] != 'B') {
vis[i] = ;
}
if(str[i] == 'B' && str[i + ] != 'C') {
vis[i] = ;
}
}
LL ans = ;
for(int l = , r; l <= n; l = r + ) {
while(vis[l]) {
++l;
}
if(l > n) break;
r = l;
while(!vis[r + ] && r < n) {
++r;
}
LL cnt = , t = ;
for(int i = l; i <= r; i++) {
if(str[i] == 'A') {
++cnt;
}
else if(str[i] == 'B' && str[i + ] == 'C') {
++i;
t += cnt;
}
}
ans += t;
}
printf("%lld\n", ans);
return ;
}

AC代码

C:题意:你有n场考试,满分X分。你的对手每场考试得了bi分。你每学习一个小时就能把某场考试提高1分。你能给每场考试选择一个li~ri之间的加权。求你最少花多少小时才能不比对手考的低。

解:发现加权要么是li要么是ri。且你比对手高就是ri,否则就是li。

然后发现如果有两场考试都没有满分,最优策略是把一场考试的分挪到另一场上。

然后就发现答案一定是若干场满分和一场非满分。这时候就可以排序了,然后二分答案,枚举非满分是哪一场。

 #include <bits/stdc++.h>

 typedef long long LL;
const int N = ; struct Node {
LL l, r, b, h;
inline bool operator < (const Node &w) const {
return h > w.h;
}
}node[N]; LL X, D, sum[N];
int n; inline LL cal(LL a, LL i) {
if(a <= node[i].b) {
return a * node[i].l;
}
return node[i].b * node[i].l + (a - node[i].b) * node[i].r;
} inline bool check(LL k) {
LL ans = , r = k % X, t = k / X;
if(t >= n) {
return sum[n];
}
// printf("r = %lld t = %lld \n", r, t);
for(int i = ; i <= n; i++) {
if(i <= t) ans = std::max(ans, cal(r, i) + sum[t + ] - node[i].h);
else {
ans = std::max(ans, cal(r, i) + sum[t]);
}
}
//printf("k = %lld ans = %lld D = %lld \n", k, ans, D);
return ans >= D;
} int main() { scanf("%d%lld", &n, &X);
for(int i = ; i <= n; i++) {
scanf("%lld%lld%lld", &node[i].b, &node[i].l, &node[i].r);
node[i].h = node[i].b * node[i].l + (X - node[i].b) * node[i].r;
D += node[i].b * node[i].l;
}
std::sort(node + , node + n + );
for(int i = ; i <= n; i++) {
sum[i] = sum[i - ] + node[i].h;
}
LL l = , r = 4e18;
while(l < r) {
LL mid = (l + r) >> ;
if(check(mid)) {
r = mid;
}
else {
l = mid + ;
}
}
printf("%lld\n", r);
return ;
}

AC代码

D:题意:给你平面上两组n个点,你要把它们配对,使得曼哈顿距离最大。n <= 1000。

解:曼哈顿距离有2个绝对值,拆开就是4种情况。直接建4个中转点表示这4种情况,跑最大费用最大流。

 #include <bits/stdc++.h>

 #define int LL

 typedef long long LL;
const int N = , INF = 0x3f3f3f3f3f3f3f3fll; struct Edge {
int nex, v, c, len;
Edge(){}
Edge(int N, int V, int C, int L) {
nex = N, v = V, c = C, len = L;
}
}edge[]; int tp = ; int e[N], n, tot, d[N], pre[N], flow[N], Time, vis[N];
std::queue<int> Q; inline void add(int x, int y, int z, int w) {
edge[++tp] = Edge(e[x], y, z, w);
e[x] = tp;
edge[++tp] = Edge(e[y], x, , -w);
e[y] = tp;
return;
} inline bool SPFA(int s, int t) {
memset(d, 0x3f, sizeof(d));
Q.push(s);
++Time;
d[s] = ;
vis[s] = Time;
flow[s] = INF;
while(Q.size()) {
int x = Q.front();
Q.pop();
vis[x] = ;
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(edge[i].c && d[y] > d[x] + edge[i].len) {
d[y] = d[x] + edge[i].len;
pre[y] = i;
flow[y] = std::min(flow[x], edge[i].c);
if(vis[y] != Time) {
vis[y] = Time;
Q.push(y);
}
}
}
}
return d[t] < INF;
} inline void update(int s, int t) {
int f = flow[t];
while(s != t) {
int i = pre[t];
edge[i].c -= f;
edge[i ^ ].c += f;
t = edge[i ^ ].v;
}
return;
} inline int solve(int s, int t, int &cost) {
cost = ;
int ans = ;
while(SPFA(s, t)) {
//printf("!");
ans += flow[t];
cost += flow[t] * d[t];
update(s, t);
}
return ans;
} signed main() { scanf("%lld", &n);
int s = * n + , t = s + , x, y, z;
for(int i = ; i <= n; i++) {
scanf("%lld%lld%lld", &x, &y, &z);
add(s, i, z, );
add(i, * n + , z, x + y);
add(i, * n + , z, y - x);
add(i, * n + , z, x - y);
add(i, * n + , z, -x - y);
}
for(int i = ; i <= n; i++) {
scanf("%lld%lld%lld", &x, &y, &z);
add(n + i, t, z, );
add( * n + , n + i, z, -x - y);
add( * n + , n + i, z, x - y);
add( * n + , n + i, z, y - x);
add( * n + , n + i, z, x + y);
}
//puts("OVER");
int cost = ;
solve(s, t, cost);
printf("%lld\n", -cost);
return ;
}

AC代码

agc034的更多相关文章

  1. 【AtCoder】AGC034

    AGC034 刷了那么久AtCoder我发现自己还是只会ABCE(手动再见 A - Kenken Race 大意是一个横列,每个点可以跳一步或者跳两步,每个格子是空地或者石头,要求每一步不能走到石头或 ...

  2. AtCoder整理(持续更新中……)

    做了那么久的atcoder觉得自己的题解发的很乱 给有想和我一起交流atcoder题目(或者指出我做法的很菜)(或者指责我为什么整场比赛只会抄题解)的同学一个索引的机会??? 于是写了个爬虫爬了下 A ...

  3. 【长期计划】Atcoder题目泛做

    之前学长跟我说的是700-的应该都能自己做? 然后1000-的应该都能有一定的思路? 记不清了 但总之是要智力康复一下 又加上文化课比较紧 所以这个大概就会是长期计划了 ————————————分鸽线 ...

随机推荐

  1. CSS——用户界面样式

    所谓的界面样式, 就是更改一些用户操作样式, 比如 更改用户的鼠标样式, 表单轮廓等.但是比如滚动条的样式改动受到了很多浏览器的抵制,因此我们就放弃了. 防止表单域拖拽 鼠标样式cursor 设置或检 ...

  2. thinkphp 包含文件

    在当前模版文件中包含其他的模版文件使用include标签,标签用法: <include file='模版表达式或者模版文件1,模版表达式或者模版文件2,...' /> 博智达直线电机价格 ...

  3. 计算几何——点线关系(叉积)poj2318

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #i ...

  4. LUOGU P3413 SAC#1 - 萌数(数位dp)

    传送门 解题思路 首先这道题如果有两个以上长度的回文串,那么就一定有三个或两个的回文串,所以只需要记录一下上一位和上上位填的数字就行了.数位\(dp\),用记忆化搜索来实现.设\(f[i][j][k] ...

  5. 浅谈简单实现file控件的图片预览,裁剪和上传。

    1.图片预览之FileReader对象    FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用File或Blob对象指定要读取的文件或数据 ...

  6. hdu多校第一场1003 (hdu6580)Milk 背包

    题意: 有一个n*m的矩阵,左右可以随便走,但只能在每一行的中点往下走,每走一格花费时间1. 现在这个矩阵里放了k瓶牛奶,第i个牛奶喝下去需要ti时间 起点是(1,1) 对于每个i∈[1,k],问喝掉 ...

  7. org.apache.ibatis.binding.BindingException: Parameter 'xxx' not found. Available parameters are [arg1, arg0, param1, param2]

    这个异常说明参数没有加上@Param注解,加上这个注解就行了. 默认情况下mybatis把参数按顺序转化为[0, 1, param1, param2],也就是说#{0} 和 #{param1} 是一样 ...

  8. Python3升级3.6强力Django+杀手级xadmin打造在线教育平台✍✍✍

    Python3升级3.6强力Django+杀手级xadmin打造在线教育平台 教程 Xadmin安装方法: settings.py 的配置: users App 下的 adminx.py 的配置:

  9. oracle 如何在一个数据库创建多个实例

    实例:是一个非固定的.基于内存的基本进程与内存结构.当服务器关闭后,实例也就不存在了. 数据库(Database)指的是固定的.基于磁盘的数据文件.控制文件.日志文件.参数文件和归档日志文件等. 一般 ...

  10. Ubuntu环境下安装Scala以及安装IntelliJ Scala插件(Plugin)

    一.Scala介绍 1.结合Spark处理大数据 这是Scala的一个主要应用,而且Spark也是那Scala写的. 2.Java的脚本语言版  可以直接写Scala的脚本,也可以在.sh直接使用Sc ...