LUOGU 3951
背景 Background
NOIP2017复赛
描述 Description
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。
输入格式 Input Format
输入数据仅一行,包含两个正整数 a 和 b,它们之间用一个空格隔开,表示小凯手 中金币的面值。
输出格式 Output Format
输出文件仅一行,一个正整数 N,表示不找零的情况下,小凯用手中的金币不能准 确支付的最贵的物品的价值。
样例输入 Sample Input
【输入输出样例 1】
math.in math.out
3 7 11
【输入输出样例 1 说明】
小凯手中有面值为 3 和 7 的金币无数个,在不找零的前提下无法准确支付价值为 1、 2、4、5、8、11 的物品,其中最贵的物品价值为 11,比 11 贵的物品都能买到,比如:
12 = 3 * 4 + 7 * 0
13 = 3 * 2 + 7 * 1
14 = 3 * 0 + 7 * 2
15 = 3 * 5 + 7 * 0
……
样例输出 Sample Output
【输入输出样例 2】
math.in
16 31
math.out
449
时间限制 Time Limitation
1s
注释 Hint
【数据规模与约定】
对于 30%的数据: 1 ≤ a,b ≤ 50。
对于 60%的数据: 1 ≤ a,b ≤ 10,000。
对于 100%的数据:1 ≤ a,b ≤ 1,000,000,000。
来源 Source
NOIP2017
#include
using namespace std;
int main()
{
//freopen("math.in","r",stdin);
//freopen("math.out","w",stdout);
long long a,b;
cin>>a>>b;
long long n=a*b-a-b;
cout<<n<<endl;
return 0;
}
LUOGU 3958
背景 Background
NOIP2017
描述 Description
现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z = 0,奶酪的上表面为z = h。
现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐 标。如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞,特别 地,如果一个空洞与下表面相切或是相交,Jerry 则可以从奶酪下表面跑进空洞;如果 一个空洞与上表面相切或是相交,Jerry 则可以从空洞跑到奶酪上表面。位于奶酪下表面的 Jerry 想知道,在不破坏奶酪的情况下,能否利用已有的空洞跑 到奶酪的上表面去?
空间内两点P1(x1,y1,z1)、P2(x2,y2,z2)的距离公式如下:
输入格式 Input Format
每个输入文件包含多组数据。
输入文件的第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。 接下来是 T 组数据,每组数据的格式如下:
第一行包含三个正整数 n,h 和 r,两个数之间以一个空格分开,分别代表奶酪中空 洞的数量,奶酪的高度和空洞的半径。
接下来的 n 行,每行包含三个整数 x、y、z,两个数之间以一个空格分开,表示空洞球心坐标为(x,y,z)。
输出格式 Output Format
输出文件包含 T 行,分别对应 T 组数据的答案,如果在第 i 组数据中,Jerry 能从下 表面跑到上表面,则输出“Yes”,如果不能,则输出“No”(均不包含引号)。
样例输入 Sample Input
3
2 4 1
0 0 1
0 0 3
2 5 1
0 0 1
0 0 4
2 5 2
0 0 2
2 0 4
样例输出 Sample Output
Yes
No
Yes
【输入输出样例 1 说明】 第一组数据,由奶酪的剖面图可见: 第一个空洞在(0,0,0)与下表面相切 第二个空洞在(0,0,4)与上表面相切 两个空洞在(0,0,2)相切
[IMG]./problemImg/noip2017day2-11.jpg[/img]
输出 Yes
第二组数据,由奶酪的剖面图可见: 两个空洞既不相交也不相切
[IMG]./problemImg/noip2017day2-12.jpg[/img]
输出 No
第三组数据,由奶酪的剖面图可见: 两个空洞相交 且与上下表面相切或相交
[IMG]./problemImg/noip2017day2-13.jpg[/img]
输出 Yes
时间限制 Time Limitation
1s
注释 Hint
对于 20%的数据,n = 1,1 ≤ h , r ≤ 10,000,坐标的绝对值不超过 10,000。
对于 40%的数据,1 ≤ n ≤ 8, 1 ≤ h , r ≤ 10,000,坐标的绝对值不超过 10,000。
对于 80%的数据,1 ≤ n ≤ 1,000,1 ≤ h , r ≤ 10,000,坐标的绝对值不超过 10,000。
对于 100%的数据,1 ≤ n ≤ 1,000,1 ≤ h , r ≤ 1,000,000,000,T ≤ 20,坐标的绝对值不超过 1,000,000,000。
来源 Source
NOIP2017
#include
using namespace std;
typedef long long ll;
inline ll read()
{
ll f=1,num=0;
char ch=getchar();
while (ch<'0'||ch>'9') { if (ch=='-') f=-1;ch=getchar(); }
while (ch>='0'&&ch<='9') num=(num<<1)+(num<<3)+ch-'0',ch=getchar();
return num*f;
}
const int maxnum=1e3+10;
ll t,n,h,r,tot,x[maxnum],y[maxnum],z[maxnum];
ll head[maxnum],ver[maxnum*maxnum],Next[maxnum*maxnum];
bool flag;
void add(int x,int y)
{
ver[++tot]=y,Next[tot]=head[x],head[x]=tot;
}
bool v[maxnum];
void dfs(int s)
{
if (s==n+1)
{
flag=1;
return ;
}
for (int i=head[s];i;i=Next[i])
if (!v[ver[i]])
v[ver[i]]=1,dfs(ver[i]);
return ;
}
int main()
{
t=read();
while (t--)
{
memset(head,0,sizeof(head));
memset(ver,0,sizeof(ver));
memset(Next,0,sizeof(Next));
n=read(),h=read(),r=read();
for (int i=1;i<=n;i++)
x[i]=read(),y[i]=read(),z[i]=read();
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
if (2*r>=sqrt(1.0*(x[i]-x[j])*(x[i]-x[j])+1.0*(y[i]-y[j])*(y[i]-y[j])
+1.0*(z[i]-z[j])*(z[i]-z[j])))
add(i,j),add(j,i);
for (int i=1;i<=n;i++)
if (r>=z[i]) add(0,i),add(i,0);
for (int i=1;i<=n;i++)
if (z[i]+r>=h) add(i,n+1),add(n+1,i);
memset(v,0,sizeof(v));
v[0]=1,flag=0;
dfs(0);
if (flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}