1.前缀和:子串简写
本质上是+=的应用。
#include <bits/stdc++.h>
using namespace std;
int k;
string s;
char c1,c2;
int ans=0,sum=0;
int main(){
cin>>k;
cin>>s;
cin>>c1>>c2;
for(int i=k-1,j=0;i<s.size();i++,j++){
if(s[j]==c1)sum++;
if(s[i]==c2)ans+=sum;
}cout<<ans;
return 0;
}
2.二分查找:冶炼金属
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int a[N],b[N];
int n;
bool check_min(int mid){
for(int i=0;i<n;i++){
if(b[i]<a[i]/mid)return false;
}return true;
}
bool check_max(int mid){
for(int i=0;i<n;i++){
if(b[i]>a[i]/mid)return false;
}return true;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)cin>>a[i]>>b[i];
int lmin=1,rmin=1e9;
int lmax = 1,rmax=1e9;
while(lmin<rmin){
int mid=lmin+rmin >> 1;
if(check_min(mid))rmin=mid;
else lmin=mid+1;
}
while(lmax<rmax){
int mid=lmax+rmax+1 >> 1;
if(check_max(mid))lmax=mid;
else rmax=mid-1;
}
cout<<lmin<<" "<<lmax<<endl;
return 0;
}
3.DFS:飞机降落
本质上是全排列;
由于测试数据过少,基本用暴力枚举,暴力枚举基本用DFS;
#include <bits/stdc++.h>
using namespace std;
int n=0;
const int N=15;
bool flag;
struct plane{
int t,d,l;}p[N];
//由于输入内容过多时,写成结构的形式;
bool vis[15];
void dfs(int cnt,int time){
if(cnt==n){
flag=true;
return;//不能直接return true,会回到上一层函数;
//return回到主函数;
}
for(int i=0;i<n;i++){
if(!vis[i]&&p[i].t+p[i].d>=time){
vis[i]=true;
dfs(cnt+1,max(time,p[i].t)+p[i].l);//利用max函数;
vis[i]=false;
}
}
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
cin>>t;
while(t--){//有多组测试数据用while;
cin>>n;
for(int i=0;i<n;i++)cin>>p[i].t>>p[i].d>>p[i].l;
flag=false;//由于有多组测试数据,所以false要开在while里;
dfs(0,0);
if(flag){
cout<<"YES"<<"\n";}
else {
cout<<"NO"<<"\n";}
return 0;
}