abc-448
A
直接模拟
B
b题比c难
题意
有m个辣椒,需要在每一个菜中尽可能的有更多辣椒,但是需要满足以下条件:
这道菜只能撒上\(A_i\)种辣椒,但是总和最多是\(B_i\)种辣椒
思路
因为Ai<=1000,所以可以用桶来优化
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
int const N=1e3+5;
int ct[N],a[N];
int main(){
cin>> n >> m;
for(int i=1;i<=m;i++)cin>> a[i];
for(int i=1,x,y;i<=n;i++){
cin>> x >> y;
ct[x]+=y;
}
for(int i=1;i<=m;i++){
ans+=min(ct[i],a[i]);
}
cout<< ans;
return 0;
}
C
题意
有n个数和q次询问,每次询问都会有k个编号。需要你求出除去那个k个编号的最小值
思路
因为k的总和不会超过\(4×10^6\)所以可以尝试从k开始入手,由于每次只要k个数,也就是说最坏的情况是第\(k+1\)小的数字,也就是说他的情况是\(1\)到\(k+1\),只需要排一下序,然后继续在用1层循环判断是否需要输出-代码如下
for(int i=1;i<=k+1;i++){
if(!mp[a[i].id]){
cout<< a[i].nm << "\n";
break;
}
}
代码
#include<bits/stdc++.h>
using namespace std;
int n,q;
int const N=3e5+5;
struct node{
int nm,id;
}a[N];
bool cmp(node x,node y){
if(x.nm!=y.nm)return x.nm<y.nm;
return x.id<y.id;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>> n >> q;
for(int i=1;i<=n;i++)cin>> a[i].nm;
for(int i=1;i<=n;i++)a[i].id=i;
sort(a+1,a+n+1,cmp);
while(q--){
int k;
cin>> k;
bool mp[N]={};
for(int i=1,num;i<=k;i++){
cin>> num;
mp[num]=1;
}
for(int i=1;i<=k+1;i++){
if(!mp[a[i].id]){
cout<< a[i].nm << "\n";
break;
}
}
}
return 0;
}

浙公网安备 33010602011771号