CF441A Valera and Antique Items题面
题面描述
有 n 个人,第 i 个人有 k[i] 个数。第 i 个人的第 j 个数的大小为 a[i][j],你拥有一个数大小为 v ,如果你的数 v 严格大于某人的至少一个数。那么认为你可以和这个人达成协议。
求你能和几个人达成协议,分别是哪几个。(答案按编号上升的顺序输出)
分析
题目里的翻译有一定迷惑性,理解后会发现此题很简单:
因为数据不大,我们可以直接对于每一个人暴力判断是否有一个数比给出的 v 小即可。
直接正着做下去,然后一旦能和一个人达成协议就统计,这样的话我们就不需要考虑答案要按编号上升的顺序输出了(因为直接找到的人就是按编号上升的顺序找的)。
完整代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
ll read()
{
ll res=0,f=1;
char c=getchar();
while(!isdigit(c) && c!='-') c=getchar();
if(c=='-') f=-1,c=getchar();
while(isdigit(c)) res=(res<<1)+(res<<3)+c-48,c=getchar();
return res*f;
}
int tot,ans[maxn];
int main()
{
int n=read(),v=read();
for(int i=1;i<=n;i++)
{
int k=read(); //我们可以直接边读入边做
bool bl=0; //bl表示当前人是否能达成协议
for(int j=1;j<=k;j++)
{
int x=read();
if(x<v) bl=1; //注意题目要求严格大于
}
if(bl) ans[++tot]=i;
}
printf("%d\n",tot);
for(int i=1;i<=tot;i++) printf("%d ",ans[i]);
return 0;
}
有问题欢迎在评论区提出!
0 条评论