A - The Third Cup is Free
水题,排个序从大到小按顺序扫一遍,不够三杯的直接加上
J - Worried School
这是个非常让人难受的模拟题。首先你的阅读能力需要过关。
解法:枚举所有的X,按照题意判断。
#include <bits/stdc++.h>
#include <cstring>
using namespace std;
#define ll long long
string a[10][50];
int main()
{
//freopen("input.txt","r",stdin);
int T;
cin>>T;
int n;
string s;
for(int cas=1; cas<=T; ++cas)
{
cin>>n;
cin>>s;
for(int i=1; i<=6; ++i)
{
for(int j=1; j<=20; ++j)
cin>>a[i][j];
// for(int j=1; j<=20; ++j)
// cout<<a[i][j]<<' ';cout<<endl;
}
set<string>chuxian;
bool flag=true;
int minn(110);
for(int x=0; x<=n; ++x)
{
chuxian.clear();
//cout<<x<<endl;
int xx=x;
while(xx)
{
for(int j=1; j<=20; ++j)
{
for(int i=1; i<=5; ++i)
{
if(chuxian.find(a[i][j])==chuxian.end())
{
chuxian.insert(a[i][j]);
xx--;
if(xx <= 0) break;
}
}
if(xx <= 0) break;
}
}
int y=n-x;
int yy = y;
for(int i=1; yy>0&& i<=20; ++i)
if(chuxian.find(a[6][i])==chuxian.end())
{
chuxian.insert(a[6][i]);
yy--;
if(yy <= 0)
break;
}
if(chuxian.size() != n) continue;
if(chuxian.find(s)==chuxian.end())
{
flag=false;
minn=min(minn,y);
}
//for(auto p : chuxian) cout<<p<<endl;
}
printf("Case #%d: ",cas);
if(flag)
puts("ADVANCED!");
else
printf("%d\n",minn);
}
return 0;
}
L - Daylight Saving Time
还是水题,记得要用公式写一下判断星期几的那个函数。
H - Engineer Assignment
看数据范围就知道是状压dp网络流 ,相当于枚举所有工程师的出现状态。顺便预处理一下每个任务可以通过那些工程师完成,保存成状态之后就会方便很多。
(写题一定要冷静,千万不能看啥就是啥)
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define find fuck
#define endl '\n'
#define next fuckme
using namespace std;
vector<int> a[11],b[11],tot[11];
int dp[11][1025];
bool can[1025];
int main()
{
int ca,n,m,cat = 1;
scanf("%d",&ca);
while(ca--)
{
scanf("%d%d",&n,&m);
int k;
for(int i = 1;i<=n;i++) a[i].clear(),tot[i].clear();
for(int i = 1;i<=m;i++) b[i].clear();
for(int i = 1;i<=n;i++)
{
scanf("%d",&k);
for(int j = 0;j<k;j++)
{
int x;
scanf("%d",&x);
a[i].pb(x);
}
}
for(int i = 1;i<=m;i++)
{
scanf("%d",&k);
for(int j = 0;j<k;j++)
{
int x;
scanf("%d",&x);
b[i].pb(x);
}
}
for(int i = 1;i<(1<<m);i++)
{
memset(can,0,sizeof(can));
bool flag = 1;
for(int j = 1;j<=m;j++)
{
if(i & (1<<(j-1))) for(int k = 0;k<b[j].size();k++) can[b[j][k]]=1;
}
for(int j = 1;j<=n;j++)
{
flag = 1;
for(int k = 0;k<a[j].size();k++)
{
if(can[a[j][k]] == 0)
{
flag = 0;break;
}
}
if(flag) tot[j].pb(i);
}
}
// for(int i = 1;i<=n;i++)
// {
// cout<<i<<':';
// for(auto x : tot[i])cout<<x<<' ';
// cout<<endl;
// }
memset(dp,0,sizeof(dp));
for(int i = 1;i<=n;i++)
{
for(int j = 0;j<(1<<m);j++)
{
dp[i][j] = max(dp[i][j],dp[i-1][j]);
int num = tot[i].size();
for(int k =0;k < num;k++)
{
if((tot[i][k] & j) == tot[i][k]) dp[i][j] = max(dp[i][j],dp[i-1][j^tot[i][k]]+1);
}
}
}
int ans = 0;
for(int i = 0;i<(1<<m);i++)
{
ans = max(ans,dp[n][i]);
}
printf("Case #%d: %d\n",cat++,ans);
}
return 0;
}