临漳专业做网站,学校网站建设的意义与途径,医疗电子科技网站建设,湖北省建设工程招标网站目录
1.简单贪心
2.区间贪心
不相交的开区间
1.如何删除#xff1f;
2.如何比较大小
区间选点问题
3.拼接最小数 1.简单贪心
比如#xff1a;给你一堆数#xff0c;你来构成最大的几位数
2.区间贪心
不相交的开区间 思路#xff1a;
首先#xff0c;如果有两个…目录
1.简单贪心
2.区间贪心
不相交的开区间
1.如何删除
2.如何比较大小
区间选点问题
3.拼接最小数 1.简单贪心
比如给你一堆数你来构成最大的几位数
2.区间贪心
不相交的开区间 思路
首先如果有两个区间包含关系肯定是取小的那个扔掉大的那个。
上一步操作完了之后区间就互不包含于是每次都在保证不相交的前提下
取左端点最大的或每次都取右端点最小的
思路是这样没错实现遇到的问题
1.如何删除 看了参考代码不用删除因为如果取左端点最大的必定是被包含的那个区间第二部包含了第一步“首先”可以不干。
2.如何比较大小
需要回忆之前学的“排序”构造结构体构造cmp函数
通过代码
#include iostream
#include vector
#include cmath
#include string
#include cstring
#include algorithm
using namespace std;
const int N10002;
int n2,W2;
int l[N]{1,2},r[N]{5,6};int ans0;
struct qj
{int left;int right;
}I[N];
bool cmp(qj a1,qj a2)
{if(a1.left!a2.left) return a1.lefta2.left;else return a1.righta2.right;
}int main()
{
scanf(%d,n);
for(int i0;in;i){scanf(%d %d,I[i].left,I[i].right);}
sort(I,In,cmp);
if(n0) ans;
int l1I[0].left;
for(int i1;in;i)
{if(I[i].rightl1){ans;l1I[i].left;}
}
printf(%d,ans);
}
区间选点问题 其实就是不相交的闭区间
点列举出的所有不相交的闭区间的左端点
真的只改了一个小于号
#include iostream
#include vector
#include cmath
#include string
#include cstring
#include algorithm
using namespace std;
const int N10002;
int n2,W2;
int l[N]{1,2},r[N]{5,6};int ans0;
struct qj
{int left;int right;
}I[N];
bool cmp(qj a1,qj a2)
{if(a1.left!a2.left) return a1.lefta2.left;else return a1.righta2.right;
}int main()
{
scanf(%d,n);
for(int i0;in;i){scanf(%d %d,I[i].left,I[i].right);}
sort(I,In,cmp);
if(n0) ans;
int l1I[0].left;
for(int i1;in;i)
{if(I[i].rightl1){ans;l1I[i].left;}
}
printf(%d,ans);
}
3.拼接最小数 仔细看例子 思路 问题如何接收这些输入并转化为实体
不能以%d输入会丢失信息 答案使用了string类c类别使用cincout
string数组每一个元素都是string
答案使用了自己构造cmp
if abba,则a排b前让sort自己排序
输出要注意00 000的情况输出且只输出一个0
#include iostream
#include vector
#include cmath
#include string
#include cstring
#include algorithm
using namespace std;
const int N10002;
int n;
string str[N];
bool cmp(string a,string b)
{return abba;
}
int main()
{
// string a123;
// cout(a[0]1);//1报错1true1false cinn;int flag0;for(int i0;in;i)cinstr[i];sort(str,strn,cmp);for(int j0;jn;j)
{for(int i0;istr[j].length();i) { if(str[j][i]!0) flag1;if(flag) coutstr[j][i];}}
if(!flag) cout0;
}
答案是这样的从while开始看用了高端的begin与erase
bool cmp(string a, string b) {return a b b a;
}int main() {int n;cin n;for (int i 0; i n; i) {cin nums[i];}sort(nums, nums n, cmp);string result ;for (int i 0; i n; i) {result nums[i];}while (result.length() 1 result[0] 0) {result.erase(result.begin());}cout result endl;return 0;
}