Codeforces Round #216 (Div. 2)

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


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值