题目

NYOJ_16 矩形嵌套

题意

有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a

解决

DAG上的动态规划
1. 二元关系能够用图来建立模型
2. 用A到B有单向边来表示矩形A能嵌套在矩形B中
3. 一个矩形不能嵌套自己,也就是说没有自环现象,也就是一个DAG

const int maxn = 1005;
struct rec
{int a,b;bool operator<(rec r2)const{if(a<r2.a&&b<r2.b) return true;     //重载小于号表示可以嵌套return false;}
}R[maxn];vector<int> G[maxn];            //用于保存单向边
int dp[maxn];
int maxx,n;
int dfs(int u)
{int &ans=dp[u];if(ans>0) return ans;ans=1;for(int i=0;i<G[u].size();i++){ans=max(ans,dfs(G[u][i])+1);}maxx=max(maxx,ans);return ans;
}
int main()
{int cases,a,b;//open();scanf("%d",&cases);while(cases--){scanf("%d",&n);memset(dp,0,sizeof(dp));rep(i,0,n) G[i].clear();rep(i,0,n){scanf("%d%d",&a,&b);if(a<b) swap(a,b);R[i].a=a;R[i].b=b;}rep(u,0,n) rep(v,0,n) if(R[u]<R[v]) G[u].push_back(v);  //添加边maxx=0;rep(i,0,n) dfs(i);printf("%d\n",maxx);}
}

GYM_100253

Travelling Camera Problem

题意

背景是记者和摄影师,摄影师的位置可以在C[]数组上(升序排好),(很难描述啊,直接看题目吧)记者的位置只能在X[]上(固定序),摄影师和记者的距离不能超过r,问摄影师最少要走过的距离

解决

暴力扫应该会超时吧…
1. 根据求出dist=sqrt(r*r-1.0);
2. 如果当前位置可以拍摄到,不用动
3. 把每一个X位置映射到C数轴上,加减dist后就能得到下一个目标位置在C轴对应的区间左端点和区间右端点
4. 对区间左端点做lower_bound,对区间右端点做upper_bound

int m,n,r;
double now,sum,tg;
double dist,C[300005],X[300005];
int get1(double x)
{int left;x-=dist;left=lower_bound(C,C+m,x)-C;        //lower_bound获取第一个>=x的地址if(left!=m) return left;return -1;
}
int get2(double x)
{int right;x+=dist;right=upper_bound(C,C+m,x)-C;       //upper_bound获取第一个严格>x的地址,减一则表示<=x的最后一个位置if(right!=m&&right!=0) return right-1;return -1;
}
int main()
{//open();scanf("%d%d%d",&m,&n,&r);rep(i,0,m) scanf("%lf",&C[i]);rep(i,0,n) scanf("%lf",&X[i]);dist=sqrt(r*r-1.0);//de(dist);now=C[0];sum=0;for(int i=0;i<n;i++){tg=X[i];//de(now);//de(tg);if(fabs(now-tg)<=dist) {continue;}  //当前位置可以拍摄到目标位置double l,r;int left=get1(X[i]);if(left==-1){l=INF;}else l=fabs(C[left]-now);int right=get2(X[i]);if(right==-1){r=INF;}else r=fabs(C[right]-now);if(l<=r){sum+=l;now=C[left];//de(left);}else{sum+=r;now=C[right];//de(right);}}printf("%.6lf\n",sum);//这个题我坑了,lower_bound和upper_bound用反了,也是因为不怎么熟悉吧,该打
}

GYM_100443

 Trending Topic

题意

每一天给出一些单词,对于每次询问,输出7天内出现次数最多的N个词(当最后一个单词出现次数一致的时候,可以>=N)

解决

方案1:

这个题在怎么排序上面纠结…
1. 用map保存最近七天单词出现的次数
2. 同样用set保存七天内单词出现的次数,类型为pair<int,string>,优先第一关键字升序排序,我们想拿到降序,把出现的次数变成负的扔进去就好了.

pair类型
1. 本身是一个结构体,优先第一关键字升序排序
2. make_pair()无需写出型别,就可以生成一个pair对象.比如我们不用写pair

#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)vector<string> day[maxn];
map<string,int> map7;                           //map建立str到int的映射
set<pair<int,string> > set7;                    //set实现排序int main()
{//freopen("data.txt","r",stdin);int days=0;string str;while(cin>>str){if(str=="<text>"){days++;continue;}if(str=="</text>"){if(days>7){rep(i,0,sz(day[days-7])){string &s=day[days-7][i];int cnt=map7[s];map7[s]--;set7.erase(set7.find(mp(-cnt,s)));  //注意set的erase方法参数是迭代器,而find函数返回值也是一个迭代器set7.insert(mp(-(cnt-1),s));}day[days-7].clear();                    //清空7天前的数据防止爆内存}continue;}if(str=="<top"){int n,cnt=0,last=1e9;cin>>n;printf("<top %d>\n",n);set<pair<int,string> >::iterator it;        //it迭代器不能进行加减操作...for(it=set7.begin();it!=set7.end();it++){if(it->first==0) break;if(it->first!=last&&cnt>=n) break;cout<< it->second <<' '<< -(it->first) <<endl;cnt++;last=it->first;}puts("</top>");continue;}if(str.size()<4) continue;day[days].push_back(str);if(map7.count(str)){int cnt=map7[str];set7.erase(set7.find(mp(-cnt,str)));set7.insert(mp(-(cnt+1),str));map7[str]++;}else{map7[str]=1;set7.insert(mp(-1,str));                        //把负数扔进去是为了按照绝对值降序,最后拿到最大值}}return 0;
}

方案2:

struct node
{int num;string str;node(){}node(int n,string s){num=n;str=s;}bool operator<(const node &n2)const{if(num==n2.num) return str<n2.str;return num>n2.num;}
};
vector<string> day[maxn];
map<string,int> map7;                           //map建立str到int的映射
set<node> set7;                                 //set实现排序int main()
{//freopen("data.txt","r",stdin);int days=0;string str;while(cin>>str){if(str=="<text>"){days++;continue;}if(str=="</text>"){if(days>7){rep(i,0,sz(day[days-7])){string &s=day[days-7][i];int cnt=map7[s];map7[s]--;set7.erase(node(cnt,s));            //注意set的erase方法参数是迭代器,而find函数返回值也是一个迭代器set7.insert(node(cnt-1,s));}day[days-7].clear();                    //清空7天前的数据防止爆内存}continue;}if(str=="<top"){int n,cnt=0,last=1e9;cin>>n;printf("<top %d>\n",n);set<node>::iterator it;                     //it迭代器不能进行加减操作...for(it=set7.begin();it!=set7.end();it++){if(it->num==0) break;if(it->num!=last&&cnt>=n) break;cout<< it->str <<' '<< it->num <<endl;cnt++;last=it->num;}puts("</top>");continue;}if(str.size()<4) continue;day[days].push_back(str);if(map7.count(str)){int cnt=map7[str];set7.erase(set7.find(node(cnt,str)));set7.insert(node(cnt+1,str));map7[str]++;}else{map7[str]=1;set7.insert(node(1,str));}}return 0;
}

20170814(三道题-DAG上DP 二分查找 map)相关推荐

  1. 日撸力扣三道题---Day3---数组算法+二分查找

    今天主要是对前两天的引用, 一道题是在一个数组中将不是0的数提前,0放到数组末尾,尽量在原数组上进行操作 解题思路是直接遍历将所有的非零数移动,改下标 代码实现 var moveZeroes = fu ...

  2. 程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 二分查找 1. 题目 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上.出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一 ...

  3. 刘书dp学习笔记(1) 数字三角形与DAG上dp(上)

    我之前没怎么看过刘书,然后前几天看了一下dp,感觉dp观被刷新了- 终于明白为什么说刘书是神书了! 用[]括住的是在下的一些浅见与笔记. 顺便一提,在下不保证代码是能过评测的,因为只试了其中几个数据. ...

  4. LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)

    1. 题目 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现. 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多 ...

  5. 17道题带你理解二分查找

    不太会的可以先看看二分查找的模板 点这里 最需要注意的是二分查找的分界线并不止局限于大于等于小于,而是对某种性质的一种分界 1.Leetcode704. 二分查找 class Solution {pu ...

  6. LeetCode 1751. 最多可以参加的会议数目 II(DP + 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 events 数组,其中 events[i] = [startDayi, endDayi, valuei] ,表示第 i 个会议在 startD ...

  7. KLEE 使用(三)------ 使用 KLEE 为二分查找生成测试

    在上一篇博文中,我们展示了如何用 KLEE 来为一个简单程序生成测试用例.在这篇博文中,我们将展示如何使用 KLEE 中的数组和断言. 0x1 测试无序数组 如下是二分查找的算法实现: int bin ...

  8. EOJ Monthly 2019.2 E 中位数 (二分+中位数+dag上dp)

    题意: 一张由 n 个点,m 条边构成的有向无环图.每个点有点权 Ai.QQ 小方想知道所有起点为 1 ,终点为 n 的路径中最大的中位数是多少. 一条路径的中位数指的是:一条路径有 n 个点,将这  ...

  9. UVA116 单向TSP Unidirectional TSP(多阶段决策问题、输出字典序最小的方案、DAG上DP)

    整理的算法模板合集: ACM模板 题目传送门 简单的多阶段决策问题. 多段图DAG,其节点可以划分为若干个阶段,每一个阶段只由上一个阶段所决定. 因为本题要求输出从前到后的方案,所以我们转移方程的时候 ...

最新文章

  1. 菜鸟学习笔记3——jQuery 选择器
  2. Oracle11g EM界面乱码解决方法
  3. Pygame:编写一个小游戏
  4. 【区块链基础知识系列】 第8课 区块链之零知识证明
  5. usb协议规范_USB连接标准接口简述发布
  6. linux内核时钟工作原理,linux内核的时钟机制
  7. COJ 1700:联通与次联通
  8. linux安装步骤_图解 Debian 10(Buster)安装步骤 | Linux 中国
  9. 【MATLAB】三维曲线(plot3)
  10. python是什么意思-Python中%是什么意思?python中百分号如何使用?
  11. log4j:warn找不到_修复log4j WARN找不到记录器的附加程序,请正确初始化log4j系统
  12. numpy广播机制小结
  13. JSONObject没有fromObject方法及其依赖引入
  14. UML之旅店预订系统
  15. 在salesforce中实现鼠标悬停显示提示框效果,并对显示框内容进行微缩页面布局
  16. windows 通过快捷键来复制粘贴当前日期时间到剪贴板
  17. 【红队】ATTCK - Active Scanning(主动扫描)
  18. 【JavaScript进阶学习】NodeJs语言的介绍及基本使用
  19. 微信小程序-001-抽签功能-008-简单登录
  20. 更改MAMP的mysql密码

热门文章

  1. LabVIEW数据类型与数据库数据类型的关系
  2. 数据库常用的数据类型
  3. 【第一课】保姆级教学,带你玩转时间复杂度和空间复杂度。
  4. motionFX ST意法半导体X-MEMS运动融合库
  5. python模拟登录密码加密_有关爬虫模拟登陆时,处理用户名密码加密问题的方法...
  6. 乐鑫各系列芯片规格对比与主打市场分析,ESP8266/ESP32/ESP32-S2/ESP32-S3/ESP32-C3
  7. 遗传算法(GA)入门知识梳理(超详细)
  8. 枫桥夜泊VS京口夜泊
  9. Pycharm 远程服务器使用要点小结
  10. Linux重启网卡提示net,linux不显示ip及重启network失败的解决方案