C. 凑二十四—dfs+表达式求值
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define int long long
int p[13];
int a[13];
int res=0,n;
int sum()
{
int op[13]={0},nums[13]={0};
for(int i=1;i<=n;i++)op[i]=p[i],nums[i]=a[i];
for(int i=1;i<n;i++)
if(op[i]==2)
nums[i+1]*=nums[i],op[i]=op[i-1],nums[i]=0;
int sum=nums[1];
for(int i=1;i<n;i++)
{
if(op[i]==0)sum+=nums[i+1];
else sum-=nums[i+1];
}
return sum;
}
void dfs(int u)
{
if(u==n)
{
if(sum()==24)res++;
return ;
}
for(int i=0;i<3;i++)
{
p[u]=i;
dfs(u+1);
}
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
dfs(1);
cout<<res<<'\n';
}
D.矩形—LIS变形
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define int long long
int n;
pair<int,int>rt[110];
int f[110];
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int a,b;cin>>a>>b;
if(a>b)swap(a,b);
rt[i]={a,b};
}
sort(rt+1,rt+n+1);
for(int i=1;i<=n;i++)
{
f[i]=1;
for(int j=1;j<i;j++)
{
if(rt[i].first>rt[j].first&&rt[i].second>=rt[j].second||rt[i].first>=rt[j].first&&rt[i].second>rt[j].second)
f[i]=max(f[i],f[j]+1);
}
}
int res=0;
for(int i=1;i<=n;i++)res=max(res,f[i]);
cout<<res<<'\n';
}
E.团队赛—二分图的最大匹配
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define int long long
vector<int>g[510];
int cx[510],cy[510];
bool vis[510];
bool st[510];
bool dfs(int u)
{
for(auto v : g[u])
{
if(!vis[v])
{
vis[v]=1;
if(cy[v]==-1||dfs(cy[v]))
{
cx[u]=v;
cy[v]=u;
return true;
}
}
}
return false;
}
signed main()
{
int n,m,r,T,K;
cin>>n>>m>>r>>T>>K;
while(K--)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
}
memset(cx,-1,sizeof cx);
memset(cy,-1,sizeof cy);
int res1=0,res2=0;
for(int i=1;i<=T/r;i++)
{
for(int u=1;u<=n;u++)
{
if(st[u]==0)
{
memset(vis,0,sizeof vis);
if(dfs(u))
{
res1++;
res2+=i*r;
}
else st[u]=1;
}
}
}
cout<<res1<<" "<<res2<<endl;
}