蓝桥杯每日真题
商品库存管理
//前缀和与差分问题
//前缀和(l-r的和):num=sum[r]-sum[l-1] ;
//差分(l-r区间每项加n): diff[l]+n , diff[r+1]-n;
//差分进行前缀和操作得到原式子;
#include <bits/stdc++.h>
using namespace std;
int n,m;
int tmp=0;
int main()
{
cin>>n>>m;int l[m+1]={0},r[m+1]={0},diff[n+1]={0};
int arr0=0;int arr1[n+1];
for(int i=1;i<=m;i++)
{
cin>>l[i]>>r[i];
diff[l[i]]++;
diff[r[i]+1]--;
}
for(int i=1;i<=n;i++)
{
tmp+=diff[i];
arr1[i]=arr1[i-1];
if(tmp==0)
{
arr0++;
}
if(tmp==1)
{
arr1[i]++;
}
}
for(int i=1;i<=m;i++)
{
int num=arr0+arr1[r[i]]-arr1[l[i]-1];
cout<<num<<endl;
}
return 0;
}
力扣刷题
1094.拼车
bool carPooling(int** trips, int tripsSize, int* tripsColSize, int capacity) {
int maxnum=0;
for(int i=0;i<tripsSize;i++)
{
if(maxnum<trips[i][2])
{
maxnum=trips[i][2];
}
}
int *diff=malloc(sizeof(int)*(maxnum+1));
memset(diff, 0, sizeof(int) * (maxnum + 1));
for(int i=0;i<tripsSize;i++)
{
diff[trips[i][1]]+=trips[i][0];
diff[trips[i][2]]-=trips[i][0];
}
long long tmp=0;
for(int i=0;i<maxnum;i++)
{
tmp+=diff[i];
if(tmp>capacity)
{
return false;
}
}
return true;
}
01背包问题
(有N种物品每种物品只有1个)
dp[i][j]:[0,i]物品任取放入容量为j的背包中。
第i个物品的价值:val[i];
第i个物品的质量:w[i];
dp[i][j]: 不取第i个物品:=dp[i-1][j];
取第i个物品:=dp[i-1][j-w[i]]+val[i];
转移方程:dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+val[i])
采药问题
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=10005;
int w[N];
int val[N];
int dp[N][N];
signed main()
{
int t,m;
cin>>t>>m;
for(int i=1;i<=m;i++)
{
cin>>w[i]>>val[i];
}
for(int i=1;i<=m;i++)
for(int j=1;j<=t;j++)
{
if(j>=zj[i])
{
dp[i][j]=max(dp[i-1][j-zj[i]]+val[i],dp[i-1][j]);
}
else
{
dp[i][j]=dp[i-1][j];
}
}
cout<<dp[m][t];
洛谷刷题
P1138 第 k 小整数
直接排序去重
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,k,t;
int ans=0;
int b[300000]={0};bool m=true;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>t;
b[t]++;
}
for(int i=1;i<30001;i++)
{
if(b[i]>0){
ans++;
}
if(ans==k){
cout<<i;
m=false;
break;
}
}
if(m)
{
cout<<"NO RESULT";
}
}
P1427 小鱼的数字游戏
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5;
signed main()
{
int a[N];int i=0;
cin>>a[i];
while(a[i]!=0)
{
cin>>a[++i];
}
for(int j=i-1;j>=0;j--)
{
cout<<a[j]<<" ";
}
return 0;
}
P1152 欢乐的跳
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5;
int n;int a[N];int b[N];
signed main()
{
cin>>n;int count=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int j=1;j<n;j++)
{
int x=fabs(a[j]-a[j-1]);
if(x>=1&&x<=n-1&&b[x]==0)
{
count++;
}
b[x]=1;
}
if(count==n-1)
{
cout<<"Jolly";
}
else
{
cout<<"Not jolly";
}
}
P1304 哥德巴赫猜想
#include <bits/stdc++.h>
#define int long long
using namespace std;
bool temp(int x)
{
for(int i=2;i<=sqrt(x);i++)优化时间复杂度令 i<=sqrt(x);
{
if(x%i==0)
{
return false;
}
}
return true;
}
void fun(int n)
{
int num=0,a,b;
for(int i=2;i<=n/2;i++)//优化时间复杂度令 i<=n/2;
{
int j=n-i;
{
if(temp(i)&&temp(j))
{
cout<<n<<"="<<i<<"+"<<j<<endl;
break;
}
}
}
}
signed main()
{
int n;
cin>>n;
for(int i=4;i<=n;i+=2)
{
fun(i);
}
return 0;
}