weiyuchao 发表于 2022-10-24 19:49:26

洛谷 C语言没有思路求帮助

题目背景
小 A 最近迷上了集卡。

题目描述
小 A 最近买了 TT 次卡牌,每次买了 nn 张(注意,不同次买的卡牌数量不一定相同)。每张卡都有一个数字编号,如果编号是 0 则代表抽到了隐藏款。

小 A 想分别知道每次购买的卡牌中,是否抽到了隐藏款。如果抽到了则输出 yes,否则输出 no。

输入格式
第一行,一个整数 TT,表示小 A 最近买了 TT 次卡牌。

接下来包含 2T2T 行数据,代表了小 A 这 TT 次购买卡牌的情况。

对于每次购买卡牌的情况,共包含两行输入。

第一行为一个整数 nn,表示购买了 nn 张卡牌。 第二行包含 nn 个整数,表示本次购买的 nn 张卡牌的数字编号。

提示: 如果无法理解输入格式,可以先阅读下方的输入输出样例,再结合样例来理解输入格式。

输出格式
共 TT 行,每行一个 yes 或者 no,表示是否抽到了隐藏款。如果抽到了则输出 yes,否则输出 no。

输入输出样例
输入 #1复制
1
5
1 2 3 4 0
输出 #1复制
yes
输入 #2复制
2
3
1 2 3
4
1 2 0 3
输出 #2复制
no
yes

cnkizy 发表于 2022-10-24 20:16:39

本帖最后由 cnkizy 于 2022-10-24 20:42 编辑

为什么要叠词?2T2T行是什么意思?

T
N1
1 2 3   <- len()=N1
...
N2
1 2 3   <- len()=N2

T次, 1次=N张, 每张有编号(编号不唯一),0=隐藏款

常规解法思路:
就是一个多重循环判断,有0就输出yes并退出,否则直到循环结束输出no

#define HIDE_ID 0 // 隐藏款id=0

for(int i=0;i<T;i++){
        int N = ...
        for(int j=0;j<N;j++){
                if(... == HIDE_ID){
                        printf("yes");exit(0);
                }
        }
}
printf("no");exit(0);


脑洞思路:
当然搞算法的脑洞肯定要大一点,凭借一点数学知识,你可以把它们全部相乘,0*任何数不就是0吗。所有结果相乘,结果为0那么一定拿到了隐藏款,对吧?
当然你要是再熟悉一点计算机知识,试着做位操作,也许更快。。
生活中遇到这种情况,要是T值特别大,你还可以考虑对每一组N单独开一个线程。别人要计算N倍时间,你这里直接快N倍。

ExiaGN001 发表于 2022-11-6 21:54:30

cnkizy 发表于 2022-10-24 20:16
为什么要叠词?2T2T行是什么意思?

T


叠词是
“直接复制md而在一个不支持md的地方粘贴原文”
导致的。
洛谷B3660原文里是没有叠词的。
原题链接付:
https://www.luogu.com.cn/problem/B3660

ExiaGN001 发表于 2022-11-6 21:58:39

本题做法:
对于每组数据,有以下几种判断方式:
1.相乘,结果为0则为yes,否则为no
2.判断,有等于0则yes,否则no
code:
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
int tmp,ans,n;
while(t--)
{
scanf("%d",&n);ans=1;
for(int i=0;i<n;i++)
{
scanf("%d",&tmp);
ans*=tmp;
}
printf(ans?"no\n":"yes\n");
}
return 0;
}

ExiaGN001 发表于 2022-11-24 20:34:15

cnkizy 发表于 2022-10-24 20:16
为什么要叠词?2T2T行是什么意思?

T


oi里不能多线程,会0分+3年禁赛
页: [1]
查看完整版本: 洛谷 C语言没有思路求帮助