一、关于vector
常用函数
pop——back:保证vector非空!
二、离散化
例题:给定a数组,求出离散化数组,并通过值找到下标
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int a[N];
vector<int> L;
int getidx(int x)
{
return lower_bound(L.begin(),L.end(),x)-L.begin();//查找一个有序数组L中第一个大于等于给定值x的元素的位置
}
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
L.push_back(a[i]);
sort(L.begin(),L.end());//利用库函数排序算法进行排序
L.erase(unique(L.begin(),L.end()),L.end());
cout<<"离散化数组为:";
for(const auto &i:L)//遍历vector的语法
cout<<i<<' ';
cout<<'\n';
int val;
cin>>val;
cout<<getidx(val)<<'\n';
return 0;
}
三、贪心
例一、OJ3412
排序不影响答案——先排序在分析试试看
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int a[N];
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
int ans=a[2]-a[1];
for(int i=1;i<n;i++)
ans=min(ans,a[i+1]-a[i]);
cout<<ans;
return 0;
}
这道题的思路和代码都挺简单的
例二、OJ545
归纳:总操作数一定的情况下的最小代价模型,运用优先队列知识
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
priority_queue<ll,vector<ll>,greater<ll>>pq;//定义优先队列
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
{
ll x;cin>>x;
pq.push(x);
}
ll ans=0;
while(pq.size()>1)
{
ll x=pq.top();pq.pop();
ll y=pq.top();pq.pop();
ans+=x+y;
pq.push(x+y);
}
cout<<ans<<'\n';
return 0;
}
其中优先队列的定义的语句含义为:这是一个优先队列的定义,其中存储的元素类型为ll
,采用升序排列
例三、OJ532
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int a[N];
int main()
{
int w,n;
cin>>w>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);//利用库函数进行排序
int l=1,r=n;//相当于用了所谓“双指针”
int ans=0;
while(l<=r)
{
ans++;
if(l==r)
break;
else if(a[l]+a[r]<=w)
{
l++;
r--;
}
else
r--;
}
cout<<ans<<'\n';
return 0;
}
例四、OJ2928
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+9;
char s[N];
int main()
{
int n,x;
cin>>n>>x;
cin>>s+1;
sort(s+1,s+1+n);
if(s[1]==s[n])
{
for(int i=1;i<=n/x+(n%x?1:0);i++)//注意这个加1还是不加1的判断
cout<<s[i];
}
else if(s[1]==s[x])
{
for(int i=x;i<=n;i++)
cout<<s[i];
}
else
cout<<s[x];
}
注意:此题的重点是分析如何对不同的字符情况进行分类