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