A.分别记录两种食物的数量,先统计第一种洗盘数,后统计第二种洗餐具数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
#define maxn 160
#define INF 1<<25
typedef long long ll;
using namespace std;
int cc[5];
int main()
{
memset(cc,0,sizeof(cc));
int tot;
int aa,bb;
int x;
scanf("%d%d%d",&tot,&aa,&bb);
for(int i=0;i<tot;i++)
{
scanf("%d",&x);
cc[x]++;
}
int ans=0;
if(cc[1]>aa)
ans+=(cc[1]-aa);
else bb+=(aa-cc[1]);
if(cc[2]>bb)
ans+=(cc[2]-bb);
printf("%d\n",ans);
}
B.两种情况分别取(int)平均数,然后把余数均匀分配。刚开始没有考虑剩余部分可能为0的情况被cha了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
#define maxn 160
#define INF 1<<25
typedef long long ll;
int num[1005];
using namespace std;
int main()
{
int tot;
int big,sma;
int lf,rt;
int fen,bfen,sfen;
scanf("%d%d%d%d%d%d",&tot,&big,&lf,&rt,&fen,&bfen);
int ii=0;
sma=tot-big;
sfen=fen-bfen;
int rec;
if(big!=0)
{
rec=bfen/big;
for(ii; ii<big; ii++)
num[ii]=rec;
if(bfen%big)
{
int rec2=bfen%big;
for(int i=0; i<rec2; i++)
num[i]++;
}
}
if(sma!=0)
{
rec=sfen/sma;
for(ii; ii<tot; ii++)
{
num[ii]=rec;
}
if(sfen%sma)
{
int rec2=sfen%sma;
for(int i=big; i<rec2+big; i++)
num[i]++;
}
}
printf("%d",num[0]);
for(int i=1; i<tot; i++)
{
printf(" %d",num[i]);
}
printf("\n");
}
C.DFS+邻接表 用DFS搜索出必须被选择的点,即后续之后没有必须被选择的点,只有N-1条路径,是稀疏图用邻接表记录。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
#define maxn 100005
#define INF 1<<25
typedef long long ll;
using namespace std;
vector < pair <int,int> > nn [maxn];
pair <int ,int > pp,qq;
int ans=0;
int aa[maxn];
int ii=0;
int dfs(int x,int y)
{
int jud=0;
int len=nn[x].size();
for(int i=0;i<len;i++)
{
if(nn[x][i].first==y)
continue;
int rec=dfs(nn[x][i].first,x);
if(nn[x][i].second==2)
{
if(rec==0)
{
aa[ii++]=nn[x][i].first;
jud++;
}
else jud+=rec+1;
}
else jud+=rec;
}
return jud;
}
int main()
{
int tot;
int a,b,c;
scanf("%d",&tot);
for(int i = 1; i <= tot; i++) nn[i].clear();
for(int i=0;i<tot-1;i++)
{
scanf("%d%d%d",&a,&b,&c);
nn[a].push_back(make_pair(b,c));
nn[b].push_back(make_pair(a,c));
}
int ans=dfs(1,-1);
printf("%d\n",ii);
if(ii==0)
return 0;
printf("%d",aa[0]);
for(int i=1;i<ii;i++)
printf(" %d",aa[i]);
printf("\n");
}