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
贪心
直接按照最坏的情况考虑,液体最多的几瓶都装水。
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}\) 图的遍历
题单:
从 \(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}\)。

浙公网安备 33010602011771号