2024牛客寒假算法基础集训营1(补题)

本人是蒟蒻,就补了过题数在一千人以上的题,AM简单题不补了。

B 关鸡

原题链接
有两种关住鸡的方式,需要分类讨论
第一种
第一种
第二种
第二种

#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
//typedef long long ll;
const int mod = 1000000007;
const int N = 2e5 + 10;
//int 类型最小-2147483647
int t,n,m,k;
int x,y,a[N],b[N];
map<int,int> m1,m2; 
void solve()
{
    m1.clear();
    m2.clear();
    cin>>n; 
    if(n==0) { // 如果点的数量为0
        cout<<3<<endl; // 输出3,第一种方式
    }else{
        
        int res1=4,res2=3; 
        bool ll=0,rr=0; 
        for(int i=0;i<n;i++) 
        {
            cin>>x>>y; 
            if(x==1&&y==1||x==1&&y==-1||x==2&&y==0) res2--; 

            if(y<=0) ll=1; 
            if(y>=0) rr=1; 
            if(x==1) m1[y]++; 
            if(x==2) m2[y]++; 
        }
        if(ll) res1--; 
        if(rr) res1--;

        bool l=0,r=0; 
        for(auto it:m1) {
            int p=it.first;
            if(p<0) 
                if(m2[p-1]||m2[p]||m2[p+1]) 
                    l=1; 
            
            if(p>0) 
                if(m2[p-1]||m2[p]||m2[p+1]) 
                    r=1; 
        }
        if(l) res1--;
        if(r) res1--; 
        cout<<min(res1,res2)<<endl; 
    }
    


}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T=1;
    cin >> T;
    while(T--)
        solve();
    return 0;
}

C 按闹分配

原题链接
贪心问题,总不满意度增加就是tc*排在鸡后面的人数
Smin=所有人的办事时间+等待时间
要有Smin,必须Ti小的在前面,使用sort排序
给定最大不满意度M,可以求出排在鸡后面的人数最多是M/tc(向下取整)
再看排在鸡前面的人时间加起来是多少,用前缀和

#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
//typedef long long ll;
const int mod = 1000000007;
const int N = 1e5 + 10;
//int 类型最小-2147483647
int a[N];
void solve()
{
    int n,q,t;
    cin >> n >> q >> t ;
    for(int i=1;i<=n;i++)   cin>>a[i] ;
    sort(a+1,a+n+1);
    while(q--)
    {
        int m;
        cin>>m;
        int res=0;
        for(int i=1;i<=n-m/t;i++) res+=a[i];
        cout<<res+t<<endl;
    }

}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T=1;
    //cin >> T;
    while(T--)
        solve();
    return 0;
}

E 本题又主要考察了贪心

原题链接
由于T(1≤T≤100),n,m(2≤n≤10,1≤m≤10)的范围比较小,直接dfs枚举,出题人故意诱导小白使用贪心来写

#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
//typedef long long ll;
const int mod = 1000000007;
const int N = 15;
//int 类型最小-2147483647
int a[N],b[N],c[N];
int n,m,res;
void dfs(int u)
{
    if(u==m )
    {
        int cnt=1;
        for(int i=2;i<=n;i++)
        {
            if(a[1]<a[i])   
                cnt++;
        }
        res=min(cnt,res);
        return;
    }
    a[b[u]]+=3;
	dfs(u+1);
	a[b[u]]-=3;
	a[c[u]]+=3;
	dfs(u+1);
	a[c[u]]-=3;
	a[b[u]]++;
    a[c[u]]++;
	dfs(u+1);
	a[b[u]]--;
    a[c[u]]--;
}


void solve()
{
   
    cin >> n >> m;
    res=n;
    for(int i = 1; i <= n; i++) cin>>a[i];
    for(int i = 0; i < m; i++) cin>>b[i]>>c[i];
    dfs(0);
    cout<<res<<endl;
    
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T=1;
    cin >> T;
    while(T--)
        solve();
    return 0;
}

G why买外卖

原题链接

#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
//typedef long long ll;
const int mod = 1000000007;
const int N = 3e6 + 10;
//int 类型最小-2147483647
pair<int, int>q[N];
void solve()
{
    int n,m,res,sum=0;
    cin>>n>>m;
    res=m;
    for(int i=1;i<=n;i++)
    {
        int u,v;
        cin>>u>>v;
        q[i]={u,v};
    }
    sort(q+1,q+n+1);
    for(int i=1;i<=n;i++)
    {
        sum+=q[i].second;
        if(q[i].first-sum<=m)
        {
            res=max (res,m+sum);
        }
    }
    cout<<res<<endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T=1;
    cin >> T;
    while(T--)
        solve();
    return 0;
}

L 要有光

原题链接
只要求地上的阴影面积,就是求梯形的面积

#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
//typedef long long ll;
const int mod = 1000000007;
const int N = 2e5 + 10;
//int 类型最小-2147483647

void solve()
{
    double c,d,h,w;
    cin >> c>>d>>h>>w;
    cout<<3*c*w<<endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T=1;
    cin >> T;
    while(T--)
        solve();
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值