noip pj,tg酱油记

来源:互联网 发布:php use require 编辑:程序博客网 时间:2024/04/29 13:10

D1

先考提高组D1.

Description

小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在小凯无法准确支付的商品。

Input

输入数据仅一行,包含两个正整数 a 和 b,它们之间用一个空格隔开,表示小凯手中金币的面值。 

Output

输出文件仅一行,一个正整数 N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。 

Sample Input

3 7

Sample Output

11

HINT

【样例说明】
小凯手中有面值为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
 

【数据规模】
对于 30%的数据: 1 ≤ a,b ≤ 50。
对于 60%的数据: 1 ≤ a,b ≤ 10,000。
对于 100%的数据:1 ≤ a,b ≤ 1,000,000,000。


T1:T1的出题模式完全不正常,结论题硬是找了两个小时,导致T2,T3爆0,也真是没谁了.

拿一百分是一百分啊

#include<stdio.h>int main(){long long a,b;scanf("%lld%lld",&a,&b);printf("%lld",a*b-a-b);}

Description

  小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序,于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。 

  A++语言的循环结构如下:

F i x y循环体E

  其中“F i x y”表示新建变量 i(变量i 不可与未被销毁的变量重名)并初始化为 x,然后判断 i 和 y 的大小关系,若 i 小于等于 y 则进入循环,否则不进入。每次循环结束后i 都会被修改成i +1,一旦 i 大于 y 终止循环。 
  x 和 y 可以是正整数(x 和 y 的大小关系不定)或变量 n。n 是一个表示数据规模的变量,在时间复杂度计算中需保留该变量而不能将其视为常数,该数远大于 100。 
  “E”表示循环体结束。循环体结束时,这个循环体新建的变量也被销毁。 
  注:本题中为了书写方便,在描述复杂度时,使用大写英文字母“O”表示通常意义下“Θ”的概念。 

Input

  输入文件第一行一个正整数 t,表示有 t(t ≤ 10)个程序需要计算时间复杂度。每个程序我们只需抽取其中 “F i x y”和“E”即可计算时间复杂度。注意:循环结构允许嵌套。 
  接下来每个程序的第一行包含一个正整数 L和一个字符串,L代表程序行数,字符串表示这个程序的复杂度,“O(1)”表示常数复杂度,“O(n^w)”表示复杂度为nw,其中w是一个小于100的正整数(输入中不包含引号),输入保证复杂度只有O(1)和O(n^w)两种类型。 
  接下来 L 行代表程序中循环结构中的“F i x y”或者 “E”。 
  程序行若以“F”开头,表示进入一个循环,之后有空格分离的三个字符(串)i x y,其中i 是一个小写字母(保证不为“n”),表示新建的变量名,x 和 y 可能是正整数或 n ,已知若为正整数则一定小于 100。 
  程序行若以“E”开头,则表示循环体结束。 

Output

  输出文件共 t 行,对应输入的 t个程序,每行输出“Yes”或“No”或者“ERR”(输出中不包含引号),若程序实际复杂度与输入给出的复杂度一致则输出“Yes”,不一致则输出“No”,若程序有语法错误(其中语法错误只有: ① F 和 E 不匹配 ②新建的变量与已经存在但未被销毁的变量重复两种情况),则输出“ERR”。 
  注意:即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出 “ERR”。 

Sample Input

8
2 O(1)
F i 1 1
E
2 O(n^1)
F x 1 n
E
1 O(1)
F x 1 n
4 O(n^2)
F x 5 n
F y 10 n
E
E
4 O(n^2)
F x 9 n
E
F y 2 n
E
4 O(n^1)
F x 9 n
F y n 4
E
E
4 O(1)
F y n 4
F x 9 n
E
E
4 O(n^2)
F x 1 n
F x 1 10
E
E

Sample Output

Yes
Yes
ERR
Yes
No
Yes
Yes
ERR

HINT

【样例说明】
  第一个程序 i 从1到 1是常数复杂度。
  第二个程序 x 从1到 n是n的一次方的复杂度。
  第三个程序有一个F 开启循环却没有 E 结束,语法错误。 
  第四个程序二重循环,n 的平方的复杂度。 
  第五个程序两个一重循环,n 的一次方的复杂度。 
  第六个程序第一重循环正常,但第二重循环开始即终止(因为n远大于100,100大于4)。 第七个程序第一重循环无法进入,故为常数复杂度。 
  第八个程序第二重循环中的变量 x 与第一重循环中的变量重复,出现语法错误②,输出ERR。 

【数据规模】
  对于 30%的数据:不存在语法错误,数据保证小明给出的每个程序的前 L/2 行一定为以 F 开头的语句,第 L/2+1 行至第 L 行一定为以 E 开头的语句,L<=10,若 x、y均为整数,x 一定小于 y,且只有 y 有可能为 n。
  对于 50%的数据:不存在语法错误,L<=100,且若x、y 均为整数,x 一定小于 y,且只有y 有可能为 n。
  对于 70%的数据:不存在语法错误,L<=100。
  对于 100%的数据:L<=100。


T2:大模拟很长时间没出了,我如果没记错的话上次是10年前出的.

我模拟赛时一遇到大模拟必爆0,让人无语.

Description

策策同学特别喜欢逛公园。公园可以看成一张N个点M条边构成的有向图,且没有自环和重边。其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的时间。 
策策每天都会去逛公园,他总是从1号点进去,从N号点出来。 
策策喜欢新鲜的事物,他不希望有两天逛公园的路线完全一样,同时策策还是一个特别热爱学习的好孩子,他不希望每天在逛公园这件事上花费太多的时间。如果1号点到N号点的最短路长为d,那么策策只会喜欢长度不超过d+K的路线。 
策策同学想知道总共有多少条满足条件的路线,你能帮帮他吗? 为避免输出过大,答案对P取模。 
如果有无穷多条合法的路线,请输出−1。 

Input

第一行包含一个整数T, 代表数据组数。 
接下来T组数据,对于每组数据: 
第一行包含四个整数 N, M, K, P,每两个整数之间用一个空格隔开。 
接下来M行,每行三个整数ai, bi, ci,代表编号为ai, bi的点之间有一条权值为 ci的有向边,每两个整数之间用一个空格隔开。

Output

输出文件包含T行,每行一个整数代表答案。

Sample Input

2
5 7 2 10
1 2 1
2 4 0
4 5 2
2 3 2
3 4 1
3 5 2
1 5 3
2 2 0 10
1 2 0
2 1 0

Sample Output

3
-1

HINT

【样例解释】
对于第一组数据,最短路为 3。 
1–5, 1–2–4–5, 1–2–3–5 为 3 条合法路径。

【数据规模】
对于不同的测试点,我们约定各种参数的规模不会超过如下

测试点编号TNMK是否有0边155100否25100020000否351000200050否451000200050否551000200050否651000200050是751000002000000否8310000020000050否9310000020000050是10310000020000050是

对于 100%的数据, 1 ≤ P ≤ 109,1 ≤ ai, bi ≤ N , 0 ≤ ci ≤ 1000。
数据保证:至少存在一条合法的路线。

T3:30分spfa硬是放弃了,没看题,正解是tarjan+dfs.




下午pj

T1,T2 20分钟内码完.

T3本来以为是dp,浪费2个小时,最后无奈只能-1

T4单调队列没写出来,暴力带走30.

栽在T3上了...



D2:

Description

  现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z = 0,奶酪的上表面为z = h。 
  现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐标。如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞,特别地,如果一个空洞与下表面相切或是相交,Jerry 则可以从奶酪下表面跑进空洞;如果一个空洞与上表面相切或是相交,Jerry 则可以从空洞跑到奶酪上表面。 
  位于奶酪下表面的 Jerry 想知道,在不破坏奶酪的情况下,能否利用已有的空洞跑到奶酪的上表面去? 
  空间内两点P1(x1,y1,z1)、P2(x2,y2,z2)的距离公式如下:
    dist(P1,P2)=(x1−x2)2+(y1−y2)2+(z1−z2)2

Input

  每个输入文件包含多组数据。 
  输入文件的第一行,包含一个正整数T,代表该输入文件中所含的数据组数。 
  接下来是T 组数据,每组数据的格式如下: 
  第一行包含三个正整数n,h 和r,两个数之间以一个空格分开,分别代表奶酪中空洞的数量,奶酪的高度和空洞的半径。 
  接下来的 n 行,每行包含三个整数 x、y、z,两个数之间以一个空格分开,表示空洞球心坐标为(x,y,z)

Output

输出文件包含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

HINT

【样例解释】
第一组数据,由奶酪的剖面图可见: 第一个空洞在(0,0,0)与下表面相切,第二个空洞在(0,0,4)与上表面相切,两个空洞在(0,0,2)相切  
输出Yes 
第二组数据,由奶酪的剖面图可见: 两个空洞既不相交也不相切  
输出No
第三组数据,由奶酪的剖面图可见: 两个空洞相交,且与上下表面相切或相交 
输出Yes

【数据规模】
对于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。

这题并查集都能崩,真是...

都不知道能拿几分啊.

以下为后改正解:

#include<stdio.h>typedef unsigned long long ll;long long h,r;long long x[1001],y[1001],z[1001];ll dis[1001][1001];int t,n;int f[1001],s[1001];long long maxx[1001],minx[1001];long long max(long long x,long long y){if(x>y)return x;return y;}long long min(long long x,long long y){if(x<y)return x;return y;}int find(int p){if(f[p]!=p)f[p]=find(f[p]);return f[p];}void merge(int x,int y){int fx=find(x),fy=find(y);if(fx==fy)return;if(s[fx]>s[fy])f[fy]=fx,s[fx]+=s[fy];elsef[fx]=fy,s[fy]+=s[fx];}int main(){int t,l,i,j,flag;scanf("%d",&t);for(l=1;l<=t;l++){flag=0;scanf("%d%lld%lld",&n,&h,&r);for(i=1;i<=n;i++)scanf("%lld%lld%lld",&x[i],&y[i],&z[i]);for(i=1;i<=n;i++)f[i]=i,s[i]=1,minx[i]=z[i],maxx[i]=z[i];for(i=1;i<=n;i++){for(j=1;j<i;j++){dis[i][j]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])+(z[i]-z[j])*(z[i]-z[j]);if(dis[i][j]<=4*r*r&&i!=j){ merge(i,j); maxx[i]=max(maxx[i],z[j]); minx[i]=min(minx[i],z[j]); }}}for(i=1;i<=n;i++){for(j=1;j<i;j++){if(find(i)==find(j)&&i!=j){maxx[i]=max(maxx[i],maxx[j]);maxx[j]=max(maxx[i],maxx[j]);minx[i]=min(minx[i],minx[j]);minx[j]=min(minx[i],minx[j]);}}}for(i=1;i<=n;i++){if((maxx[i]+r>=h)&&(minx[i]-r<=0)){flag=1;printf("Yes\n");break;}}if(flag==0)printf("No\n");}}

Description

  参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋,也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度。 
  小明决心亲自前往挖掘所有宝藏屋中的宝藏。但是,每个宝藏屋距离地面都很远,也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路则相对容易很多。 
  小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某个宝藏屋的通道,通往哪个宝藏屋则由小明来决定。 
  在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路。已经开凿出的道路可以任意通行不消耗代价。每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路所能到达的宝藏屋的宝藏。另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏屋之间的道路无需再开发。 
  新开发一条道路的代价是: 
  这条道路的长度 × 从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋)。 
  请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代价最小,并输出这个最小值。

Input

第一行两个用空格分离的正整数 n 和 m,代表宝藏屋的个数和道路数。 
接下来 m 行,每行三个用空格分离的正整数,分别是由一条道路连接的两个宝藏屋的编号(编号为 1~n),和这条道路的长度 v。

Output

输出共一行,一个正整数,表示最小的总代价。

Sample Input

Sample Input I:
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 1
Sample Input II:
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 2

Sample Output

Sample Output I:
4
Sample Output II:
5

HINT

【样例解释】
样例一中
小明选定让赞助商打通了 1 号宝藏屋。小明开发了道路 1->2,挖掘了 2 号宝藏。开发了道路 1->4,挖掘了 4 号宝藏。还开发了道路 4->3,挖掘了 3 号宝藏。工程总代价为:1×1 + 1×1 + 1×2 = 4  
(1->2)  (1->4)  (4->3)

样例二中
小明选定让赞助商打通了 1 号宝藏屋。小明开发了道路 1->2,挖掘了 2 号宝藏。开发了道路 1->3,挖掘了 3 号宝藏。还开发了道路 1->4,挖掘了 4 号宝藏。工程总代价为:1×1 + 3×1 + 1×1 = 5  

 

【数据规模】
对于 20%的数据:保证输入是一棵树,1≤n≤8,v≤5000 且所有的v 都相等。
对于 40%的数据:1≤n≤8,0≤m≤1000,v≤5000 且所有的 v 都相等。 
对于 70%的数据:1≤n≤8,0≤m≤1000,v≤ 5000 
对于 100%的数据:1≤n≤12,0≤m≤1000,v≤ 500000 

对于T2我直接放弃,去看T3.

Description

  Sylvia 是一个热爱学习的女孩子。 
  前段时间,Sylvia 参加了学校的军训。众所周知,军训的时候需要站方阵。 Sylvia所在的方阵中有n × m名学生,方阵的行数为 n,列数为m。 
  为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中的学生从 1 到 n × m 编上了号码(参见后面的样例)。即:初始时,第 i 行第 j 列的学生的编号是(i − 1) × m + j。 
  然而在练习方阵的时候,经常会有学生因为各种各样的事情需要离队。在一天中,一共发生了 q 件这样的离队事件。每一次离队事件可以用数对(x, y) (1≤x≤n, 1≤y≤m)描述,表示第 x 行第 y 列的学生离队。 
  在有学生离队后,队伍中出现了一个空位。为了队伍的整齐,教官会依次下达这样的两条指令: 
    1. 向左看齐。这时第一列保持不动,所有学生向左填补空缺。不难发现在这条指令之后,空位在第 x 行第 m 列。 
    2. 向前看齐。这时第一行保持不动,所有学生向前填补空缺。不难发现在这条指令之后,空位在第 n 行第 m 列。 
  教官规定不能有两个或更多学生同时离队。即在前一个离队的学生归队之后,下一个学生才能离队。因此在每一个离队的学生要归队时,队伍中有且仅有第 n 行第 m 列一个空位,这时这个学生会自然地填补到这个位置。 
  因为站方阵真的很无聊,所以 Sylvia 想要计算每一次离队事件中,离队的同学的编号是多少。 
  注意:每一个同学的编号不会随着离队事件的发生而改变,在发生离队事件后方阵中同学的编号可能是乱序的。 

Input

输入共 q+1 行。 
第1 行包含 3 个用空格分隔的正整数 n, m, q,表示方阵大小是 n行 m 列,一共发生了q 次事件。 
接下来 q 行按照事件发生顺序描述了 q 件事件。每一行是两个整数 x, y,用一个空格分隔,表示这个离队事件中离队的学生当时排在第 x 行第 y 列。 

Output

按照事件输入的顺序,每一个事件输出一行一个整数,表示这个离队事件中离队学生的编号。 

Sample Input

2 2 3
1 1
2 2
1 2

Sample Output

1
1
4

HINT

【样例解释】

列队的过程如上图所示,每一行描述了一个事件。 
在第一个事件中,编号为 1 的同学离队,这时空位在第一行第一列。接着所有同学向左标齐,这时编号为 2 的同学向左移动一步,空位移动到第一行第二列。然后所有同学向上标齐,这时编号为 4 的同学向上一步,这时空位移动到第二行第二列。最后编号为1 的同学返回填补到空位中。

 

【数据规模】
数据保证每一个事件满足 1≤x≤n,1≤y≤m。

测试点编号nmq其他约定1,2,3,4,5,6<=1000<=1000<=500无7,8,9,10<=5*104<=5*10411,12=1<=105<=105所有事件x=113,14<=3*105<=3*10515,16<=3*10517,18<=105<=105<=105无19,20<=3*105<=3*105<=3*105


对于T3,暴力30轻松拿到

n=1时树状数组带走20分.



总体并不满意,栽到D1T2,D2T1,pjT3上了

要不然还可以pj,tg各高50分

要不就省1了

PS:吉林省分数线较低.

原创粉丝点击