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;
  }
}

n不要开大!不然会死的很惨

代码

#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;
}
posted @ 2026-03-08 16:53  李想is蒟蒻  阅读(1)  评论(0)    收藏  举报