AtCoder Beginner Contest 441

AtCoder Beginner Contest 441 (Promotion of Engineer Guild Fes)

A Black Square

判断 \((X,Y)\) 是否在 以 \((P,Q)\) 为左上角,边长为 \(100\) 的正方形内 即可。

int p,q,x,y;
scanf("%d%d%d%d",&p,&q,&x,&y);
if(0<=x-p&&x-p<=99&&0<=y-q&&y-q<=99) printf("Yes\n");
else printf("No\n"); 

B Two Languages

先统计出 \(Takahashi\) 语言包含哪些字母,\(Aoki\) 语言包含哪些字母。

scanf("%d%d%s%s",&n,&m,&s,&t); 
for(int i=0;i<n;i++)
    vis1[s[i]]=true;
for(int i=0;i<m;i++)
    vis2[t[i]]=true;

对于每一个询问:

  • 如果某个字母属于两种语言,跳过
  • 如果某个字母不属于任何一种语言,无法判断
  • 如果字符串中同时存在只属于 \(Takahashi\) 语言的字母 和 只属于 \(Aoki\) 语言的字母,无法判断
  • 剩下的就能判断具体是哪种语言
while(q--)
{
    char ch[N];
    scanf("%s",&ch);
    int len=strlen(ch);
    bool flag1=false,flag2=false; 
    //flag1 表示存在只属于 Takahashi 语言的字母
    //flag2 表示存在只属于 Aoki 语言的字母
    for(int i=0;i<len;i++)
    {
        if(!vis1[ch[i]]&&!vis2[ch[i]]) 
        {
            printf("Unknown\n");
            break;
        }
        else if(vis1[ch[i]]&&vis2[ch[i]]) continue;
        else if(vis1[ch[i]]) flag1=true;
        else if(vis2[ch[i]]) flag2=true;
        if(flag1&&flag2)
        {
            printf("Unknown\n");
            break;
        }
    }
    if(flag1&&!flag2) printf("Takahashi\n");
    else if(!flag1&&flag2) printf("Aoki\n");
    else if(!flag1&&!flag2) printf("Unknown\n");
}

C Sake or Water

贪心

题单:第4单元 贪心与分治 - 1

直接按照最坏的情况考虑,液体最多的几瓶都装水

Takahashi 先把所有的水都喝了,剩下的都是酒。

此时 Takahashi 知道每个瓶子内装了多少酒,就从多到少喝。

\(sum\) 统计 Takahashi 一共喝了多少酒,如果大于等于 \(X\),输出累计喝了多少瓶。

如果所有酒喝完也没有到 \(X\),就输出 \(-1\)

sort(a+1,a+1+n,mycmp);
LL sum=0;
for(int i=n-k+1;i<=n;i++)
{
    sum+=a[i];
    if(sum>=x)
    {
        printf("%d\n",i);
        return 0;
    }
}
printf("-1\n");

D Paid Walk

\(\text{DFS}\) 图的遍历

题单:

第6单元 搜索

第8单元 图与树

\(1\) 出发,遍历整张图,统计经过边的数量和权值和。

当经过了 \(L\) 条边时,判断权值和是否在 \([S,T]\) 之间,如果在,当前点就标记为正确答案。

void dfs(int x,int cnt,int sum)
{
	if(cnt==l)
	{
		if(s<=sum&&sum<=t) vis[x]=true;
		return;
	}
	for(int i=head[x];i!=-1;i=Edge[i].nxt)
	{
		int y=Edge[i].y,val=Edge[i].val;
		dfs(y,cnt+1,sum+val);
	}
}

最后按顺序输出所有的正确答案即可。

for(int i=1;i<=n;i++)
    if(vis[i]) printf("%d ",i);
printf("\n"); 

由于 \(1\leq L \leq 10\),每个点的出度小于等于 \(4\),时间复杂度为 \(O(4^L)\),不会 \(\text{TLE}\)

posted @ 2026-01-31 15:38  Lan_Sky  阅读(1)  评论(0)    收藏  举报