暑假第四次考试 冲刺Noip模拟赛4 解题报告——五十岚芒果酱

题1 韬韬抢苹果(apple)

【问题描述】
又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹
果。每个韬韬都想要最大的苹果,所以发生了争执,为了解决他们的矛盾,出题人定了一项
特殊的规则,按体重的大小来定顺序,每一轮都是先由胖的先摘(照顾胖子),每个韬韬都
是很聪明的,不会错过眼前最大的苹果。现在问题来了,一共有 n 个苹果,m 个韬韬,要你
按原顺序输出每个韬韬可以抢到的苹果的总大小。
【输入格式】apple.in
第一行两个数 n,m。
接下来一行 n 个数,分别为每个苹果的大小。
接下来一行 m 个数,分别为每个韬韬的体重。
【输出格式】apple.out
一行 m 个数,每个韬韬抢到的苹果的大小。
【输入样例】
5 3
1 2 3 4 5
1 2 3
【输出样例】
3 5 7
【 数据规模 】
n,m<=100000

题目

 tag:模拟

 思路:模拟即可,为了防止被极端数据卡开了long long。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cmath>
 6 #define ll long long
 7 #define maxn 100010
 8 using namespace std;
 9 ll ans[maxn];
10 int ap[maxn],po,n,m;
11 struct TT{
12     int w,id;
13 }tt[maxn];
14 bool cmp1(int x,int y)
15 {
16     return x>y;
17 }
18 bool cmp2(TT x,TT y)
19 {
20     return x.w>y.w;
21 }
22 int main()
23 {
24     //freopen("apple.in","r",stdin);
25     //freopen("apple.out","w",stdout);
26     scanf("%d%d",&n,&m);
27     for(int i=1;i<=n;++i) scanf("%d",&ap[i]);
28     for(int i=1;i<=m;++i){
29         scanf("%d",&tt[i].w);
30         tt[i].id=i;
31     }
32     sort(ap+1,ap+n+1,cmp1);
33     sort(tt+1,tt+m+1,cmp2);
34     int f=po=1;
35     while(1){
36         for(int i=1;i<=m;++i){
37             ans[tt[i].id]+=ap[po++];
38             if(po>n){
39                 f=0;
40                 break;
41             }
42         }
43         if(!f) break;
44     }
45     for(int i=1;i<=m;++i) cout<<ans[i]<<" ";
46     return 0;
47 }

题2  开场舞蹈(dance)

【问题描述】
在全世界人民的期盼下,2008 年北京奥林匹克运动会终于隆重召开了!
为了展示中华民族博大精深的优秀传统文化,负责开幕式开场舞蹈的编排人员一丝不
苟,每一个细节都力争完美。关于队伍是采用“天圆”阵还是“地方”阵的问题,大家讨论
了七天七夜,仍没有结果。于是,他们希望借助计算机,计算两种阵型的成本。
队伍将排列在一个二维平面内,且必须以(0,0)点为中心使得队伍保持对称美。“天
圆”阵是一个圆形,而“地方”阵则是一个边平行于坐标轴的正方形。由于某种因素,阵型
要求覆盖某些点(可以在边上)。
你的任务是,计算出能够覆盖这些点的两种阵型的最小面积。
【输入文件】
输入文件  dance.in。第一行是一个整数 n(1<=n<=100000),表示需要覆盖的点的个数。
接下来 n 行,第 i 行是两个整数 xi,yi(-1000<=xi,yi<=1000),表示第 i 个点的坐标位
置(xi,yi)。
【输出文件】
输出文件  dance.out。第一行是一个整数 s1,表示能够覆盖这些点的“天圆”阵的最小
面积(pi=3.14,四舍五入)。第二行是一个整数 s2,表示能够覆盖这些点的“地方”阵的
最小面积。
【样例输入】
4
0 0
0 2
5 0
8 0
【样例输出】
201
256

题目

tag:模拟

思路:取最大值,注意四舍五入的处理,乘10取整,再将mod10的结果与5比较。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cmath>
 6 #define ll long long
 7 #define maxn 100010
 8 using namespace std;
 9 const double pi=3.14;
10 int n,A,ans;
11 double R;
12 double cal(int x,int y){return sqrt((double)(x*x+y*y));}
13 int main()
14 {
15     //freopen("dance.in","r",stdin);
16     //freopen("dance.out","w",stdout);
17     int x,y;
18     scanf("%d",&n);
19     for(int i=1;i<=n;++i){
20         scanf("%d%d",&x,&y);
21         R=max(R,cal(x,y));
22         A=max(A,max(abs(x),abs(y)));
23     }
24     y=(int)(R*R*pi*10);
25     ans=y/10;
26     if(y%10>=5) ans++;
27     printf("%d\n",ans);
28     printf("%d\n",A*A*4);
29     return 0;
30 }

题3 架设电话线(phoneline)

【 问题描述 】
Farmer John 打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务。
于是,FJ 必须为此向电信公司支付一定的费用。
FJ 的农场周围分布着 N(1 <= N <= 1,000)根按 1..N 顺次编号的废弃的电话线杆,任意两
根电话线杆间都没有电话线相连。一共 P(1 <= P <= 10,000)对电话线杆间可以拉电话线,其
余的那些由于隔得太远而无法被连接。
第 i 对电话线杆的两个端点分别为 A_i、B_i,它们间的距离为 L_i (1 <= L_i <=
1,000,000)。数据中保证每对{A_i,B_i}最多只出现 1 次。编号为 1 的电话线杆已经接入了
全国的电话网络,整个农场的电话线全都连到了编号为 N 的电话线杆上。也就是说,FJ 的
任务仅仅是找一条将 1 号和 N 号电话线杆连起来的路径,其余的电话线杆并不一定要连入
电话网络。
经过谈判,电信公司最终同意免费为 FJ 连结 K(0 <= K < N)对由 FJ 指定的电话线杆。
对于此外的那些电话线,FJ 需要为它们付的费用,等于其中最长的电话线的长度(每根电
话线仅连结一对电话线杆)。如果需要连结的电话线杆不超过 K 对,那么 FJ 的总支出为 0。
请你计算一下,FJ 最少需要在电话线上花多少钱。
【输入格式】
* 第 1 行: 3 个用空格隔开的整数:N,P,以及 K
* 第 2..P+1 行: 第 i+1 行为 3 个用空格隔开的整数:A_i,B_i,L_i
【输入样例】phoneline.in
5 7 1
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6
【输入说明】
一共有 5 根废弃的电话线杆。电话线杆 1 不能直接与电话线杆 4、5 相连。电话线杆 5
不能直接与电话线杆 1、3 相连。其余所有电话线杆间均可拉电话线。电信公司可以免费为
FJ 连结一对电话线杆。
【输出格式】
* 第 1 行: 输出 1 个整数,为 FJ 在这项工程上的最小支出。如果任务不可能完成,输
出-1
【输出样例】phoneline.out
4
【输出说明】
FJ 选择如下的连结方案:1->3;3->2;2->5,这 3 对电话线杆间需要的电话线的长度分
别为 4、3、9。FJ 让电信公司提供那条长度为 9 的电话线,于是,他所需要购买的电话线的
最大长度为 4。

题目

tag:二分、最短路

思路:由于对于路径的选择、寻找答案都有很大的不确定性,可以考虑二分答案x作划分免费和付费的分界线,它也是付费边的上限,如果选择的边比x大视作距离为1,否则距离为0,那么dis[n]就被赋予了新的意义——从点1到点n最少选择的大于x的边数,再看有没有超过k。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #define ll long long
 8 #define maxn 100010
 9 #define inf 1<<30
10 using namespace std;
11 int n,m,k,hl[1010],vis[1010],dis[1010],cnt,cs[20010];
12 queue<int>Q;
13 struct X{
14     int u,v,w,ne;
15 }e[20010];
16 void add(int u,int v,int w)
17 {
18     e[++cnt].u=u;
19     e[cnt].v=v;
20     e[cnt].w=w;
21     e[cnt].ne=hl[u];
22     hl[u]=cnt;
23 }
24 void spfa()
25 {
26     memset(dis,127/3,sizeof(dis));
27     dis[1]=0;
28     vis[1]=1;
29     Q.push(1);
30     while(!Q.empty()){
31         int u=Q.front();
32         Q.pop();
33         for(int i=hl[u];i;i=e[i].ne){
34             int v=e[i].v;
35             if(dis[v]>dis[u]+cs[i]){
36                 dis[v]=dis[u]+cs[i];
37                 if(!vis[v]){
38                     vis[v]=1;
39                     Q.push(v);
40                 }
41             }
42         }
43         vis[u]=0;
44     }
45 }
46 bool div2(int x)
47 {
48     memset(cs,0,sizeof(cs));
49     for(int i=1;i<=n;++i)
50         for(int j=hl[i];j;j=e[j].ne)
51             if(e[j].w>x) cs[j]=1;
52     spfa();
53     return dis[n]<=k;
54 }
55 bool cmp(int x,int y){
56     return x>y;
57 }
58 int main()
59 {
60     //freopen("phoneline.in","r",stdin);
61     //freopen("phoneline.out","w",stdout);
62     int x,y,w;
63     scanf("%d%d%d",&n,&m,&k);
64     for(int i=1;i<=m;++i){
65         scanf("%d%d%d",&x,&y,&w);
66         add(x,y,w);
67         add(y,x,w);
68     }
69     int l=0,r=1000001;
70     while(l<r){
71         int mid=(l+r)>>1;
72         if(div2(mid)) r=mid;
73         else l=mid+1;
74     }
75     r==1000001?printf("-1"):printf("%d\n",r);
76     return 0;
77 }

题4 洪水(slikar)

【问题描述】
一天,一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安全
的。
森林的地图由 R 行 C 列组成,空白区域用点“.”表示,洪水的区域用“*”表示,而
岩石用“X”表示,另画家的住所用“D”表示,画家用“S”表示。
有以下几点需要说明:
1.每一分钟画家能向四个方向移动一格(上、下、左、右)
2.每一分钟洪水能蔓延到四个方向的相邻格子(空白区域)
3.洪水和画家都不能通过岩石区域
4.画家不能通过洪水区域(同时也不行,即画家不能移到某个格子,该格子在画家达到
的同时被洪水蔓延到了,这也是不允许的)
5. 洪水蔓不到画家的住所。
给你森林的地图,编写程序输出最少需要花费多长时间才能从开始的位置赶回家中。
【输入】
输入第一行包含两个整数 R 和 C(R,C<=50)。
接下来 R 行每行包含 C 个字符(“.”、“*”、“X”、“D”或“S”)。地图保证只有一个“D”
和一个“S”。
【输出】
输出画家最快安全到达住所所需的时间,如果画家不可能安全回家则输出“KAKTUS”。
【输入输出样例 1 】
slikar.in slikar.out
3 3
D.*
...
.S.

3
【输入输出样例 2 】
slikar.in slikar.out
3 3
D.*
...
..S

KAKTUS
【输入输出样例 3 】
slikar.in slikar.out
3 6
D...*.
.X.X..
....S.

6

题目

tag:模拟/dfs、bfs/最短路

思路:初始化所有点洪水出现的时间为无穷大,以每个“*”作基点向外dfs预处理更新时间(能取到最小值再扩展,此处算是剪枝),之后bfs走迷宫,到达的时间一定要先于洪水出现的时间,也可以二维转一维跑SPFA。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #define ll long long
 8 #define maxn 2510
 9 #define inf 707406378
10 using namespace std;
11 int dx[]={0,1,0,-1},dy[]={1,0,-1,0},n,m,cnt,dis[maxn],hl[maxn],MP[maxn],S,T,vis[maxn];
12 char mp[60][60];
13 queue<int>Q;
14 struct X{
15     int u,v,w,ne;
16 }e[maxn*4];
17 void add(int u,int v)
18 {
19     e[++cnt].u=u;
20     e[cnt].v=v;
21     e[cnt].ne=hl[u];
22     hl[u]=cnt;
23 }
24 int cal(int x,int y){return (x-1)*m+y;}
25 bool ok(int x,int y)
26 {
27     if(x>=1&&x<=n&&y>=1&&y<=m) return true;
28     return false;
29 }
30 void dfs(int x,int y,int t)
31 {
32     if(!t||(ok(x,y)&&mp[x][y]==‘.‘&&t<MP[cal(x,y)])){
33         MP[cal(x,y)]=t;
34         for(int i=0;i<4;++i) dfs(x+dx[i],y+dy[i],t+1);
35     }
36 }
37 bool spfa()
38 {
39     dis[S]=0;
40     vis[S]=1;
41     Q.push(S);
42     while(!Q.empty()){
43         int u=Q.front();
44         Q.pop();
45         for(int i=hl[u];i;i=e[i].ne){
46             int v=e[i].v,aft=dis[u]+1;
47             if(dis[v]>aft&&MP[v]>aft){
48                 dis[v]=aft;
49                 if(!vis[v]){
50                     vis[v]=1;
51                     Q.push(v);
52                 }
53             }
54         }
55         vis[u]=0;
56     }
57     if(dis[T]==inf) return false;
58     return true;
59 }
60 int main()
61 {
62     //freopen("slikar.in","r",stdin);
63     //freopen("slikar.out","w",stdout);
64     memset(dis,127/3,sizeof(dis));
65     memset(MP,127/3,sizeof(MP));
66     scanf("%d%d",&n,&m);
67     for(int i=1;i<=n;++i)
68         for(int j=1;j<=m;++j)
69             scanf(" %c",&mp[i][j]);
70     for(int i=1;i<=n;++i)
71         for(int j=1;j<=m;++j){
72             if(mp[i][j]==‘*‘) dfs(i,j,0);
73             else{
74                 switch(mp[i][j]){
75                     case ‘S‘:S=cal(i,j);break;
76                     case ‘D‘:T=cal(i,j);break;
77                     case ‘X‘:continue;break;
78                 }
79                 for(int k=0;k<4;++k){
80                     int X=i+dx[k],Y=j+dy[k],t=1;
81                     if(ok(X,Y)&&mp[X][Y]!=‘*‘&&mp[X][Y]!=‘X‘) add(cal(i,j),cal(X,Y));
82                 }
83             }
84         }
85     if(!spfa()) puts("KAKTUS");
86     else printf("%d\n",dis[T]);
87     return 0;
88 }

————————今天好晚了懒得粘分割线呢————————

  芒果君:表示这次终于没有翻车,没有预计结果因为害怕这么多模拟写炸,最后还挺高的,开森,不过以后还是要多刷图论啊。

时间: 2024-10-12 17:20:16

暑假第四次考试 冲刺Noip模拟赛4 解题报告——五十岚芒果酱的相关文章

暑假第二次考试 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱

题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n-2 个路口,分别标上号,A 农场为 1 号,B 农场为 n 号,路口分别为 2...n-1 号,从 A 农场到 B 农场有很多条路径可以到达,而 CG 发现有的路口是必须经过的,即每条路径都经过的路口,CG 要把它们记录下来,这样 CG 就可以先到那个路口,观察新牛们有没有偷懒,而你的任务就是找出所有必经路口. [输入格式] 第一行两个用空格隔开的

冲刺Noip2017模拟赛6 解题报告——五十岚芒果酱

1.ksum(ksum) [问题描述] Peter喜欢玩数组.NOIP这天,他从Jason手里得到了大小为n的一个正整数 数组. Peter求出了这个数组的所有子段和,并将这n(n+1)/2个数降序排序,他想 知道前k个数是什么. [输入格式] 输入文件名为 ksum.in. 输入数据的第一行包含两个整数 n 和 k. 接下来一行包含 n 个正整数,代表数组. [输出格式] 输出文件名为 ksum.out. 输出 k 个数,代表降序之后的前 k 个数,用空格隔开. [输入输出样例] ksum.i

冲刺Noip2017模拟赛7 解题报告——五十岚芒果酱

1.二叉树(binary) 1.二叉树 (binary.cpp/c/pas) [问题描述] 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: (4)没有键值相等的结点. 完全二叉树:只有最下面的两层结点度能够小于2,并且最下面一层的结点 都集中在该层最左边的若干位置的二叉树. 图1中,(a)和(b)是完全二叉树,(c)和(

冲刺Noip2017模拟赛8 解题报告——五十岚芒果酱

1.鼎纹 [问题描述] 据说鼎纹的 种制造 式是 铜模印出来的,这是我国古代劳动 智慧 的结晶.铜模印过的地 ,会留下深深的印记,经过时间的炼化,洗 练成历史的遗存. 聪明的古代劳动人民拥有一个 a 行 b 列的铜模,每个位置要么是 0(代表 这个点是平的),要么是 1(代表这个点是凸起的).他们想造 个 n 行 m 列 的鼎 ,其中每个位置也都是 0 或 1,表示经过若干 次印后,每个位置的结果. 有一些要求.铜模是不能旋转和翻转的:在印的过程当中,铜模的凸起不 能出现在鼎面的外面(平的部分是

暑假第五次考试 冲刺NOIP模拟赛

1. 公约数(gcd) [问题描述] 给定一个正整数,在[1,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] 输出共一行,一个正整数表示答案. [输入输出样例] gcd .in gcd .out 3 1 解释:只有(2,3)满足要求 [数据范围] 对于30%的数据满足n<=1000 对于60%的数据满足n<=10^5 对于100%的数据满足n<=10^7 题目 tag:数学 思路:就一个等式,g

CH Round #55 - Streaming #6 (NOIP模拟赛day2)解题报告

T1九九归一 描述 萌蛋在练习模n意义下的乘法时发现,总有一些数,在自乘若干次以后,会变成1.例如n=7,那么5×5 mod 7=4,4×5 mod 7=6,6×5 mod 7=2,2×5 mod 7=3,3×5 mod 7=1.如果继续乘下去,就会陷入循环当中.萌蛋还发现,这个循环的长度经常会是φ(n),即小于n且与n互质的正整数的个数.例如,φ(7)=6,而上述循环的长度也是6,因为5,4,6,2,3,1共有6个数.再如n=6,那么5×5 mod 6=1.这个循环的长度很短,只有2,而恰好φ

CH Round #54 - Streaming #5 (NOIP模拟赛Day1)解题报告

最近参加了很多CH上的比赛呢~Rating--了..题目各种跪烂.各种膜拜大神OTZZZ T1珠 描述 萌蛋有n颗珠子,每一颗珠子都写有一个数字.萌蛋把它们用线串成了环.我们称一个数字串是有趣的,当且仅当它的第1位是2,且除了第1位以外的每一位都是3.例如,2,233,2333333都是有趣的数字串.现在,你可以从这串珠子的任意一颗开始读,沿着顺时针或逆时针方向,到任意一颗珠子停止.这样,你就可以读出一个数字串来.萌蛋想知道,所有能读出的有趣的数字串当中,最长的是哪一个数字串.当然,你也可能读不

20161022 NOIP模拟赛 T2 解题报告

旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起点的距离为ai千米(ai为非负整数).不存在两个目的地和起点的距离相同. 从第i个目的地走到第j个目的地所走的路程为 |ai-aj|千米.我们把参观n个目的地的顺序称作一次“旅行”.lahub可以参观他想要参观的任意顺序,但是每个目的地有且只能被参观一次(参观顺序为n的排列). lahub把所有可能

【一个蒟蒻的挣扎】模拟赛2解题报告

---恢复内容开始--- 今天50分,我自闭 眼瞎看错了一道题,然后两道题的代码都出了点小毛病,自闭 真的竞赛我要这样可以收拾收拾退役了真的,眼睛不能这么瞎了考试莫得人帮忙改了 如果一切都没问题今天应该有130,啊!!!!!!!!!!!!!!!!! 今天两题可以用堆,一题模拟随便写写就过了,(所以我为什么考这么差) 进入正题 题目一览(其实就3道题)(CZR到底是谁这么爱数学和折磨我们) 24点 小游戏 中位数 题1. 24点 题目描述 1.1 Background CZR很喜欢学数学,但是他数