天梯1(二进制枚举)

1.B孵化小鸡(二进制枚举,列举每种情况,取符合条件的最便宜的方案)

#include <bits/stdc++.h>
using namespace  std;
#define  PII pair<int,int>
int a[1000000],l1[1000000],r1[1000000],k[1000000],p[1000000];
int main()
{
    int n,m;
    cin>>n>>m;
    while(n--)
    {
        int l,r,w;
        cin>>l>>r>>w;
        for(int i=l;i<=r;i++)
            a[i]=w;
    }
    for(int i=0;i<m;i++)
        cin>>l1[i]>>r1[i]>>k[i]>>p[i];
    int res=INT_MAX;
    for(int i=0;i<(1<<m);i++)//二进制枚举
    {
        int ans=0;
        int b[10000]={0};
        for(int j=0;j<m;j++)
        {
            if(i&(1<<j))
            {
                ans+=p[j];
                for(int f=l1[j];f<=r1[j];f++)
                {
                    b[f]+=k[j];
                }
            }
        }
        int s=1;
        for(int o=1;o<=100;o++)
        {
            if(a[o]==-1||b[o]<a[o])
            {
                s=0;
                break;
            }
        }
        if(s)res=min(res,ans);
    }
    cout<<res<<endl;
    return 0;
}

2.D划分田地easy(同样是二进制枚举,列举完各种情况后记录此矩形的范围,和没被选进的点比较,如果没选进的点在矩形内,则此情况不符,反之,则总数加一)

#include<bits/stdc++.h>
using namespace std;
#define  PII pair<int,int>
int main()
{
    int n;
    cin>>n;
    vector<PII>w(n);
    for(int i=0;i<n;i++)
        cin>>w[i].first>>w[i].second;
     int ans=0;
    for(int i=0;i<(1<<n);i++)
    {
        vector<PII> oth;
        int max1=0,min1=INT_MAX,max2=0,min2=INT_MAX;
        for(int j=0;j<n;j++)
        {
            if(i&(1<<j))
            {
                max1=max(max1,w[j].first);
                min1=min(min1,w[j].first);
                max2=max(max2,w[j].second);
                min2=min(min2,w[j].second);
            }
            else oth.push_back(w[j]);
        }
        int s=1;
        for(auto&[a,b]:oth)
        {
            if(a>=min1&&a<=max1&&b>=min2&&b<=max2)
            {
                s=0;
                break;
            }
        }
        if(s)ans++;
    }
    cout<<ans<<endl;
    return 0;
}

3.G相加余三easy(列举三种情况然后比较大小即可)

#include<bits/stdc++.h>
using namespace std;
int a[10000];
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)cin>>a[i];
	int y=0,e=0,s=0,m=0;
	for(int i=0;i<n;i+=2)
	{
		if(n-i-1<2)break;
		y+=(a[i]+a[i+1])%3;
	}
	m=max(m,y);
	for(int i=n-1;i>=0;i-=2)
	{
		if(i==0)break;
		e+=(a[i]+a[i-1])%3;
	}
	m=max(m,e);
	for(int i=0;i<n/2;i++)
	{
		s+=(a[i]+a[n-i-1])%3;
	}
	m=max(m,s);
	cout<<m<<endl;
	return 0;
}

4.J最后都是0(每次循环减去当前数最大的一位即可,不是减去同一个最大值😮‍💨)

#include<bits/stdc++.h>
using namespace std;
int big(int n)
{
    int b=0;
    for(int i=0;i<7;i++)
    {
        if(n==0)break;
        int c=n%10;
        n/=10;
        b=max(b,c);
    }
    return b;
}
int main()
{
    int n;
    cin>>n;
    int ans=0;
    while(n)
    {
        int k=big(n);
        n-=k;
        ans++;
    }
    cout<<ans;
    return 0;
}

  

posted @ 2024-03-10 14:18  伊芙加登  阅读(8)  评论(0编辑  收藏  举报