概要
本次考试只考了220分(满分400分)
Problem 1: 数你太美(60分,没考虑我说的情况)
题目大意:两个正整数数列 {a_i} , {b_i} ,长度分别为 n , m ,其中每个数都小于 10。定义一个正整数是“美丽的正整数”,当且仅当:这个数的十进制表示中,至少有一个数位上的数在数列 a_i 出现过,至少有一个数位上的数在数列 b_i 出现过。现在PB希望求出最小的“美丽的正整数”。
这题很简单,有一些细节要注意
比如
3 3
9 9 1
9 9 2
答案是9,不是12。
#include<cstdio> #include<iostream> using namespace std; int a[100],b[100]; int main() { int n,m; scanf("%d%d",&n,&m); int x=2147483647,y=2147483647,ans=2147483647; for (int i=1;i<=n;i++) scanf("%d",&a[i]),x=min(a[i],x); for (int i=1;i<=m;i++) scanf("%d",&b[i]),y=min(b[i],y); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (a[i]==b[j]) ans=min(ans,a[i]); if (ans!=2147483647) printf("%d ",ans); else if (x>y) printf("%d%d ",y,x); else printf("%d%d ",x,y); }
Problem 2: 逃亡(100分)
题目大意:
从前有个平面直角坐标系,坐标系里有座学校。这是一个矩形,左下角是 (0,0),右上角是 (n,m)。有 k 个蒟蒻在校园中。第 i 个蒟蒻在 (xi,yi) 的位置。由于一些不可抗因素,所有 xi 互不相同,所有 yi 互不相同。这时 PB 要来抓蒟蒻们做实验了!
蒟蒻们听到这个消息,也是四处逃亡,只要逃到校园的边界上就不会被PB抓到。每个蒟蒻可以沿着任意路线逃亡。然而蒟蒻们反应迟钝,所以如果两个蒟蒻的逃亡路线有交点,它们就有可能相撞,就会被 PB 抓住。所以任意两人的路线不能有交点。
现在蒟蒻们想知道,蒟蒻全部能成功逃亡的路线的长度之和的最小值。(虽然,这对神通广大的 PB 根本不是一回事……)
这题也很水,认真想一想
把矩形划分成如下图的四个区域, 因 xi、 yi 互不相同, 可以观察出: 每个人直接往四边
中最近的一边径直跑即可。
#include<cstdio> #include<iostream> using namespace std; int main() { int n,m,k,x,y; scanf("%d%d%d",&n,&m,&k); double ans=0; for (int i=1;i<=k;i++) { scanf("%d%d",&x,&y); int l=min(x,n-x),r=min(y,m-y); ans=ans+min(l,r); } printf("%.3lf ",ans); }
Problem 3: 数数字
题目大意:
PB带来了若干只蒟蒻。
众所周知,NTF是数论学会的会长,于是PB准备用数字击败NTF,以证明PB比NTF更强。
于是PB准备了一些卡片,并在每个蒟蒻头上都贴了一张卡牌。每个卡牌上都写了一个数字。
由于蒟蒻太弱了,甚至不会看镜子来了解自己头上的数字,但他们由于经常被大佬吊打,所以观察力敏锐,他们都知道别人头上的数字。
第i个蒟蒻会告诉你他看到了ai种数字(定义两个数字不同种当且仅当它们的值不同)
但是由于蒟蒻太弱了,可能会报错数据,NTF需要核实是否有一种情况使所有蒟蒻说的话都正确。(可能情况不唯一)
对于每一只蒟蒻,若它的卡片数值唯一则他所看到的卡片种类总
数为 max-1,我们称卡片数值唯一的蒟蒻是孤独的。
故若 ai 的max和min的差大于等于 2 则无解
下面对max和min的差进行分类讨论:
若 max=min,那么此时每只蒟蒻看到的卡片种类都为 max。如果每只蒟蒻看到的
卡片种类的总数都是 max-1,则每只蒟蒻都是孤独的,此时 max+1=n。 否则每只蒟蒻所看到的卡片
种类的总数都是 max,由于不存在孤独的蒟蒻,所以 max至多为n/2。
若 max=min+1,此时我们可以统计孤独的蒟蒻的个数 x,类似上面的推论, 数值总数至少为
x+1,至多为 x+(n-x)/2。故当 max=min+1 时, x+1 ≤ max ≤ x+(n-x)/2(向下取整)
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int a[1000005],p[1000005]; int main() { int t; scanf("%d",&t); while (t--) { int n,x=0,y=2147483647; scanf("%d",&n); memset(p,false,sizeof(p)); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); x=max(x,a[i]); y=min(y,a[i]); } if (x-y>=2) { printf("no "); continue; } if (x==y) { if (x+1==n) { printf("yes "); continue; } if (x*2<=n) { printf("yes "); continue; } printf("no "); continue; } if (x==y+1) { int t1=0; for (int i=1;i<=n;i++) if (a[i]==y) t1++; if (t1+1<=x&&x<=t1+(n-t1)/2) { printf("yes "); continue; } printf("no "); continue; } } }