两道题

1.edu 25 D. Suitable Replacement

题意:给定字符串s,t,s中‘?’字符可以以任何字符替换,问如何替换 可使 替换后的s重新排序与t的匹配次数最多(len_t<len_s)

分析:

1.比赛时又用贪心模拟结果把自己写死了啊啊啊

2.一些贪心的题可以用二分做,而且如果二分的check()简单的话比贪心好写

3.如果一些题感觉贪心模拟过程很复杂,就尝试用二分

4.这题匹配次数是很经典的二分用法,居然没想到,唉,再接再厉

    #include <bits/stdc++.h>#define fi first#define se second#define rep( i ,x ,y ) for( int i= x; i<= y ;i++ )#define reb( i ,y ,x ) for( int i= y; i>= x ;i-- )#define mem( a ,x ) memset( a ,x ,sizeof(a))using namespace std;typedef long long ll;typedef pair<int ,int> pii;typedef pair<ll ,ll> pll;typedef pair<string ,int> psi;const int N = 200005;const int inf = 0x3f3f3f3f;ll mp[5000] ,tmp[5000];string s ,t;// check()匹配次数,是很经典的二分题了bool check( ll x ){ll tm = mp['?'];rep( i ,'a' ,'z' ){if( x*tmp[i] > mp[i])tm -= x*tmp[i] - mp[i];//cout<<"x "<<x<< " i "<<(char)i<< "tm "<<tm<<endl;if( tm <0 )return false;}return true;}int main( ){cin >>s>>t;mem( mp ,0 ); mem( tmp ,0 );int ls = s.size() ,lt = t.size( );rep( i ,0 ,ls-1 )mp[s[i]]++;rep( i ,0 ,lt-1 )tmp[t[i]]++;if( mp['?']==0 )return (cout<<s), 0;ll l = 0 ,r = 1000001 ,ans = 0;while( l<=r ){ll mid = ( l+r ) >>1;if( check(mid) ) l = mid+1 ,ans = mid;else r = mid-1;}//cout<<ans<<endl;rep( i ,'a' ,'z'){mp[i] = ans*tmp[i] - mp[i];}rep( i ,0 ,ls-1 ){if( s[i]=='?' ){int flag = 1;rep( j ,'a' ,'z'){if( mp[j] >0) {cout<<(char)j;mp[j]--; flag = 0;break;}}if( flag )cout<<'a';}else cout<<s[i];}return 0;}

2. div2 #577 D.Treasure Hunting

题意:给定一张地图,一些坐标位置有宝藏,只有部分竖列有梯子可以向下移动(不能向上),任何位置都可以左右移动,问寻完所有宝藏的最短步数

1.比赛时我想的是dp ,但当时就自暴自弃了,因为我知道写出来代码会很长,比赛结束前我调试不完

2.因为只有一个方向(下)的移动 ,每一排最左右的两个点是落脚位置(其他的点都会经过),走到每一排的最短步数是最优子结构且无后效性,所以可以dp

当时我想的dp的转移状态有四个:

根据当前的落脚位置判断(l,r)转移方向,走的梯子肯定是(当前或下一排的l)左右最靠近的梯子 或(当前或下一排的r)左右最靠近的梯子(贪心思想)

3.赛后再写发现不太对,因为这样转移水平方向会来回重复走

应该是:

这样每一排的状态就能相连成从上到下的最短路径

4.然后因为初始状态和边界又调试了很久orz

dp时状态和转移方程确定以后要特别注意初始状态

否则往往功亏一篑

#include <bits/stdc++.h>#define fi first
#define se second
#define rep( i ,x ,y ) for( int i= x; i<= y ;i++ )
#define reb( i ,y ,x ) for( int i= y; i>= x ;i-- )
#define mem( a ,x ) memset( a ,x ,sizeof(a))
using namespace std;typedef long long ll;
typedef pair<int ,int> pii;
typedef pair<ll ,ll> pll;
typedef pair<string ,int> psi;const int N = 200005;
const int inf = 0x3f3f3f3f;int n ,m ,k ,q;
ll li[N] ,ri[N] ,way[N] ,dl[2][N] ,dr[2][N] ,dp[N][5];
ll res ,id[N];
int main( ){res = 0;mem( li ,inf );mem( ri ,-1 );mem( dl ,inf );mem( dr ,inf );mem( dp ,inf );scanf("%d%d%d%d" ,&n ,&m ,&k ,&q );ll tmpl ,tmp;li[1] = ri[1] = 1;rep( i ,1 ,k ){scanf("%lld%lld" ,&tmpl ,&tmp );li[tmpl] = min( li[tmpl] ,tmp );ri[tmpl] = max( ri[tmpl] ,tmp );}rep( i ,1 ,q ){scanf("%lld" ,&way[i]);}sort( way+1 ,way+1+q );int pos1 ,pos2;//找靠近左右最近的梯子 rep( i ,1 ,n ){if( ri[i] == -1 )continue;pos1 = upper_bound( way+1 ,way +1+q ,ri[i] )-way;pos2 = pos1 - 1;// error --2if( pos1 != q+1 ) dr[0][i] = way[pos1];if( pos2 != 0 ) dr[1][i] = way[pos2];pos1 = upper_bound( way+1 ,way +1+q ,li[i] )-way;pos2 = pos1 - 1;if( pos1 != q+1 ) dl[0][i] = way[pos1];if( pos2 != 0 ) dl[1][i] = way[pos2];}ll cnt = 0; tmp = -1;rep( i ,1 ,n ){if( ri[i] == -1 )tmp++;else id[ ++cnt ] = i ,res += ++tmp ,tmp = 0;}//cout<< "dp 1 -- z 2 -- ] 3 -- C 4 -- rz "<<endl;dp[0][1] = dp[0][3] = abs( li[1] - ri[1]);// 初始状态又搞错了 ,初始状态必须从li[1] 开始 rep( i ,1 ,cnt-1 ){ ll tmp1 ,tmp2 ,tmp3 ,tmp4 ,j = id[i] ,k = id[i+1];dp[i][1] =  min(dp[i-1][1] ,dp[i-1][3]) +  abs( li[k] - ri[k]);//cout<<"j ,k "<<j<<" "<<k<<endl;//cout<<"dr dl j "<<dr[0][j]<<" "<<dr[1][j]<<" "<<dl[0][j]<<" "<<dl[1][j]<<endl;//cout<<"dr dl k "<<dr[0][k]<<" "<<dr[1][k]<<" "<<dl[0][k]<<" "<<dl[1][k]<<endl;//cout<<"ri li j "<<ri[j]<<" "<<li[j]<<endl;//cout<<"ri li k "<<ri[k]<<" "<<li[k]<<endl;tmp1 =abs( ri[ j ] - dr[0][j] ) + abs( li[ k ] - dr[0][j] );tmp2 =abs( ri[ j ] - dr[1][j] ) + abs( li[ k ] - dr[1][j] );tmp3 =abs( ri[ j ] - dl[0][k] ) + abs( li[ k ] - dl[0][k] );tmp4 =abs( ri[ j ] - dl[1][k] ) + abs( li[ k ] - dl[1][k] );dp[i][1] += min( min(tmp1 ,tmp2) ,min(tmp3,tmp4));dp[i][2] =  min(dp[i-1][1] ,dp[i-1][3]) +  abs( li[k] - ri[k]);tmp1 =abs( ri[ j ] - dr[0][j] ) + abs( ri[ k ] - dr[0][j] );tmp2 =abs( ri[ j ] - dr[1][j] ) + abs( ri[ k ] - dr[1][j] );tmp3 =abs( ri[ j ] - dr[0][k] ) + abs( ri[ k ] - dr[0][k] );tmp4 =abs( ri[ j ] - dr[1][k] ) + abs( ri[ k ] - dr[1][k] );dp[i][2] += min( min(tmp1 ,tmp2) ,min(tmp3,tmp4));dp[i][3] =  min(dp[i-1][2] ,dp[i-1][4]) + abs( li[k] - ri[k]);tmp1 =abs( li[ j ] - dl[0][j] ) + abs( li[ k ] - dl[0][j] );tmp2 =abs( li[ j ] - dl[1][j] ) + abs( li[ k ] - dl[1][j] );tmp3 =abs( li[ j ] - dl[0][k] ) + abs( li[ k ] - dl[0][k] );tmp4 =abs( li[ j ] - dl[1][k] ) + abs( li[ k ] - dl[1][k] );dp[i][3] += min( min(tmp1 ,tmp2) ,min(tmp3,tmp4));dp[i][4] =  min(dp[i-1][2] ,dp[i-1][4]) + abs( li[k] - ri[k]);tmp1 =abs( li[ j ] - dl[0][j] ) + abs( ri[ k ] - dl[0][j] );tmp2 =abs( li[ j ] - dl[1][j] ) + abs( ri[ k ] - dl[1][j] );tmp3 =abs( li[ j ] - dr[0][k] ) + abs( ri[ k ] - dr[0][k] );tmp4 =abs( li[ j ] - dr[1][k] ) + abs( ri[ k ] - dr[1][k] );dp[i][4] += min( min(tmp1 ,tmp2) ,min(tmp3,tmp4));//cout<<"dp "<<i <<" "<< dp[i][1]<<" "<<dp[i][2]<<" "<<dp[i][3] <<" "<<dp[i][4]<<endl;
    }if(cnt == 1)printf("%lld" ,ri[1]-li[1]); else printf( "%lld" ,res+min( min(dp[cnt-1][1] ,dp[cnt-1][2]) ,min(dp[cnt-1][3] ,dp[cnt-1][4])) ) ;// find shortest way return 0;
}

5.然鹅这道题的题解是用贪心做的

贪心的过滤可以只保留上图2,3两种转移方式(其他的一定不如这两种步数少),然后就只有唯一一条转移路径(2,3交替),递推到最后就是答案

orz还是思维有缺陷,再接再厉,再接再厉

转载于:https://www.cnblogs.com/-ifrush/p/11310191.html

8.6 edu25 ,577#div2 CF补题(二分 ,dp 与 贪心相关推荐

  1. 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)(补题记录)

    一篇来自ACM入门者的补题记录 文章目录 A.机器人 B.吃豆豆 C.拆拆拆数 E.流流流动 F.爬爬爬山 I.起起落落 J.夺宝奇兵 A.机器人 题意:有两条平行线段A,B,长度从1~n,机器人一开 ...

  2. 2019 CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题记录

    一篇来自ACM入门者的补题记录 最近有点懒,想着还有最后一篇博客没完成,是我最大的补题动力. 不过终于在camp过去三个月的时候完成了所有的补题博客,有点欣慰,下一个目标应该是补一补一年前暑期训练的题 ...

  3. CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题

    A Aqours 题解: https://www.cnblogs.com/qieqiemin/p/11251645.html D:吉良吉影的奇妙计划 (暴力打表) 题目描述 吉良吉影是一个平凡的上班族 ...

  4. 【CF补题】【ABC】Codeforces Round #777 (Div. 2) C++代码

     A. Madoka and Math Dad [题意]求连续不带零且不相等位数的最大十进制数,使其位数之和为 n.有t个测试n [思考]根据样例我们就可以推测答案是121212...或212121. ...

  5. 【CF补题】【D】Educational Codeforces Round 125 (Rated for Div. 2) C++代码

    D. For Gamers. By Gamers. 现有 n 种兵种,每种有单位招募代价.攻击力.生命值三个数值.需回答 m 次询问--每次询问给出魔王的攻击.生命,问在以下条件下,击败魔王至少需要花 ...

  6. 八月十七日个人训练小结(补题)

    前言 今天主要是补题,牛客,杭电和落下的cf 一.杭电补题 1.Shortest Path in GCD Graph 答案只有1和2,开始想用最短路,最后还是没能解决,这不是一个最短路问题,算是思维题 ...

  7. codeforces round div2,3周赛补题计划(从开学到期末)

    1. 本学期场次 从2020.09.19-2021.01.18,一共18周. 题号 场次 日期 备注 1475 Codeforces Round #697 (Div. 3) 1.25 1474 Cod ...

  8. Codeforces补题记录(1)

    文章目录 Codeforces补题记录(1) 1.Codeforces Round #632 (Div. 2)(2020.4.11) A.Little Artem B.Kind Anton *C.Eu ...

  9. 2021年洛谷一月月赛(Div1、Div2,6题)全部题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.P7285 「EZEC-5」修改数组(思维) B.P7286 「EZEC-5」人赢(贪心) ...

最新文章

  1. jQuery 核心 - noConflict() 方法,jQuery 文档操作 - detach() 方法
  2. 如何在Eclipse中添加新建包,java文件,工程工具栏按钮
  3. 领域驱动设计(DDD:Domain-Driven Design)
  4. DM8168_ETV_V1.1开发板mount主机常见问题
  5. 全字符微信名 php,PHP方法处理微信昵称特殊符号过滤
  6. azure上传excel_使用MS Excel访问Azure中的关系SQL数据库
  7. MongoDB.so: undefined symbol: HeUTF8解决方法
  8. tiny core linux 7.1,极度简约 最小 Linux 发行版 Tiny Core Linux 7.1 发布
  9. streamlit + opencv/YOLOv3 快速构建自己的图像目标检测demo网页(七)
  10. laravel 分页带参数
  11. 贴花纸怎么贴_地砖保护膜怎么贴—怎么贴地砖保护膜
  12. pyqt5转pyqt6需要注意的事项
  13. 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(八)——反馈
  14. 最简单音乐播放器,还有歌词
  15. Bmob关联Android,Android使用Bmob后台数据
  16. linux文件搜索关键字并显示前后10行
  17. 计算机硬盘能达到5g的速度,5G网络速度达到1G,但硬盘读写速度才几十兆,怎么办...
  18. 国内计算机类学术期刊投稿指南
  19. 产品经理经常面临的系统须知大拷问
  20. 51单片机学习2——DS1302制作简易数码管电子时钟

热门文章

  1. 当你写爬虫抓不到APP请求包的时候该怎么办?【高级篇-混淆导致通用Hook工具失效】...
  2. 初创企业如何实现2天快速上线?
  3. 360推出国内首个工业互联网安全态势感知系统
  4. AR VR或将彻底变革广告营销行业
  5. Windows Server 2008 R2正式版尝鲜体验
  6. Shell(6): 多线程操作及线程数
  7. 由来源地址决定显示什么页面
  8. BP网络算法及其改进
  9. [笔记] SRAM Controller
  10. 介绍一下unicode,ansi,utf-8,unicode big endian编码