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