目录
1、删数问题
删数问题 - 洛谷https://www.luogu.com.cn/problem/P1106
注意:
- 贪心策略是每次删除递增序列的最后一个数
- 注意:当整个数列全递增的时候是删除最后一个数,而且要把长度符合以及本条件符合这两个条件一块判断,千万不要等删完坡点之后才判断是否走到了最后一位,因为有可能删除的时候是i指向倒数第二位,删完之后i就成最后一位了,会多删一次,所以洛谷上的测试2、6 WR了
- 两个特判: (1)一开始就特判需要删除的个数是不是比该数本身的位数还要大,那么直接输出0,并返回。 (2)删去前导零,eg:最后的结果是0089,那么应该删去前导0变为89。注意!当字符串仅一位数的时候就不需要再删除了。因为如果是零,那么就说明最后的结果是零,再删就空了;如果不是0,那更得留下来。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str;
int k;
cin>>str;
cin>>k;
if(k>=str.size()) {cout<<0;return 0;}//特判,当需要删除的数比字符串长度还要大时,输出0并退出
while(k--)
{
int i=0;
for(i;(i<str.size()-1)&&(str[i]<=str[i+1]);i++);//当走到最后一位或者当前值比后一个数大的时候就退出循环
//cout<<i<<" "<<str[i]-'0'<<" ";//可自行测试用哦
str.erase(i,1);
//cout<<str<<" "<<endl;
}
while(str.size()>1&&str[0]=='0')//特判前导零
str.erase(0,1);
cout<<str;
}
2、部分背包问题
【深基12.例1】部分背包问题 - 洛谷https://www.luogu.com.cn/problem/P2240就强调一点!(卡了我好一会)
精度问题!像按照性价比进行排序,但是需要做除法,故可能会出现精度问题,本来两个数的性价比是不一样的,但是由于除法自动保留前六位的原因,会导致两个物品的性价比一样了,从而报错。所以不用除法,用交叉相乘代替,详见下代码
#include <bits/stdc++.h>
using namespace std;
struct JB{
int m,v;
}jb[110];
bool cmp(JB a,JB b)
{
return a.v*b.m>b.v*a.m;//当遇到除法的时候,谨防进精度问题,所以用交叉相乘把除法替换掉
}
int main()
{
int n,bag;
cin>>n>>bag;
for(int i=0;i<n;i++)
{
cin>>jb[i].m>>jb[i].v;
}
sort(jb,jb+n,cmp);
double ans=0;
int i;
for(i=0;i<n;i++)
{
if(bag<jb[i].m)break;
ans+=jb[i].v,bag-=jb[i].m;
//cout<<i<<" "<<jb[i].v<<" "<<bag<<endl;
}
if(i<n)ans+=jb[i].v*(bag*1.0/jb[i].m);
//当该物品整个塞塞不下的时候,就按照背包的容量进行分割
printf("%.2f",ans);
return 0;
}
3、活动安排问题
4167. 活动安排 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/4170/贪心策略:按照活动结束时间进行从早到晚的排序,先安排早结束的活动。
小技巧:仅需一次遍历,每次记录上次结束的活动序号,目的是:判断当前扫描到的活动开始时间是不是在其后。
如果需要输出具体都安排了哪些活动,可在活动结构体中增加编号,同时增加全局变量visited[]记录哪些活动被访问过。
#include <bits/stdc++.h>
using namespace std;
struct active
{
int from,to;
} hd[1005];
bool cmp(active a1,active a2)
{
return a1.to<a2.to;
}
int main()
{
int ans=0;
int n;cin>>n;
if(n!=0) ans=1;
for(int i=0;i<n;i++)
{
cin>>hd[i].from>>hd[i].to;
}
sort(hd,hd+n,cmp);
int preact=0;
for(int i=1;i<n;i++)
{
if(hd[i].from>=hd[preact].to) ans++,preact=i;//只需要记录上一次活动结束的时间,将其于当前活动的开始时间进行比较,即可判断当前活动是不是能选
}
cout<<ans;
}