三鑫普及组模拟赛

韬韬抢苹果:

题目:

又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹果。每个韬韬都想要最大的苹果,所以发生了争执,为了解决他们的矛盾,出题人定了一项特殊的规则,按体重的大小来定顺序,每一轮都是先由胖的先摘(照顾胖子),每个韬韬都是很聪明的,不会错过眼前最大的苹果。现在问题来了,一共有n个苹果,m个韬韬,要你按原顺序输出每个韬韬可以抢到的苹果的总大小。

思路:大水题!!!直接模拟。

code:

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 typedef long long ll;
 5
 6 int n,m;
 7 int app[100001];
 8 ll sum[100001];
 9 struct ozj {
10     int wei,num;
11 } tt[100001];
12
13 bool cmd(int x,int y) {
14     return x>y;
15 }
16 bool cmp(ozj x,ozj y) {
17     return x.wei>y.wei;
18 }
19 int main() {
20     scanf("%d%d",&n,&m);
21     for(int i=1; i<=n; ++i) {
22         scanf("%d",&app[i]);
23     }
24     for(int i=1; i<=m; ++i) {
25         scanf("%d",&tt[i].wei);
26         tt[i].num=i;
27     }
28     sort(tt+1,tt+m+1,cmp);
29     sort(app+1,app+1+n,cmd);
30     int j=1;
31     for(int i=1; i<=n; ++i) {
32         if(j>m) {
33             j=1;
34         }
35         sum[tt[j].num]+=app[i];
36         j++;
37     }
38     for(int i=1; i<=m; ++i) {
39         printf("%lld ",sum[i]);
40     }
41     return 0;
42 }

开场舞蹈:

题目:

在全世界人民的期盼下,2008年北京奥林匹克运动会终于隆重召开了!

为了展示中华民族博大精深的优秀传统文化,负责开幕式开场舞蹈的编排人员一丝不苟,每一个细节都力争完美。关于队伍是采用“天圆”阵还是“地方”阵的问题,大家讨论了七天七夜,仍没有结果。于是,他们希望借助计算机,计算两种阵型的成本。

队伍将排列在一个二维平面内,且必须以(0,0)点为中心使得队伍保持对称美。“天圆”阵是一个圆形,而“地方”阵则是一个边平行于坐标轴的正方形。由于某种因素,阵型要求覆盖某些点(可以在边上)。

你的任务是,计算出能够覆盖这些点的两种阵型的最小面积。

思路:

水题,不想讲。

code:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 using namespace std;
 5
 6 int n,x,y;
 7 double pi=3.14;
 8 long long max1=-1,max2=-1;
 9 double ans1=-1;
10 long long ans2=-1;
11 double len;
12
13 int max(int x,int y) {
14     if(x>y) {
15         return x;
16     }
17     return y;
18 }
19 double maxn(double x,double y) {
20     if(x>y) {
21         return x;
22     }
23     return y;
24 }
25 bool cmp(int x,int y) {
26     return x>y;
27 }
28 int main() {
29     scanf("%d",&n);
30     for(int i=1; i<=n; i++) {
31         scanf("%d%d",&x,&y);
32         len=sqrt(abs(x)*abs(x)+abs(y)*abs(y));
33         max1=max(max1,x);
34         max2=max(max2,y);
35         ans1=maxn(ans1,len);
36     }
37     ans2=max(max1,max2);
38     ans1=ans1*ans1*pi;
39     ans2=2*ans2*2*ans2;
40     printf("%.0lf\n%lld",ans1,ans2);
41     return 0;
42 }

架设电话线:

题目:

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最少需要在电话线上花多少钱。

思路:

二分答案,在判定是否可行时,只需要判断是否能寻找到一条路径,使得该路径上大于我们二分的这个值的边不超过k条,实质上就是最短路做的一个变形而已,小于二分的值的边可以看做边权为0,大于的可以看做边权为1,直接求最短路看是否小于k即可。

空间和时间可以不用优化(最好还是优化一下);

下面的代码有优化。

code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #define N 2100
 6 #define M 2100000
 7 using namespace std;
 8 int n,p,k;
 9 int st[N+1],tot;
10 struct edge
11 {
12     int to,val,last;
13 }e[M<<1|1];
14 void add(int a,int b,int c)
15 {
16     e[++tot].to=b;
17     e[tot].val=c;
18     e[tot].last=st[a];
19     st[a]=tot;
20 }
21 struct node
22 {
23     int x,y;
24 };
25 int dis[N+1][N+1];
26 bool vis[N+1][N+1];
27 int spfa()
28 {
29     queue<node> q;
30     q.push((node){1,0});
31     memset(dis,0x3f,sizeof(dis));
32     dis[1][0]=0;
33     while(!q.empty())
34     {
35         node u=q.front();
36         vis[u.x][u.y]=false;
37         q.pop();
38         for(int i=st[u.x];i!=0;i=e[i].last)
39         {
40             int v=e[i].to;
41             if(max(dis[u.x][u.y],e[i].val)<dis[v][u.y])
42             {
43                 dis[v][u.y]=max(dis[u.x][u.y],e[i].val);
44                 if(!vis[v][u.y])
45                     vis[v][u.y]=true,q.push((node){v,u.y});
46             }
47             if(u.y<k&&dis[u.x][u.y]<dis[v][u.y+1])
48             {
49                 dis[v][u.y+1]=dis[u.x][u.y];
50                 if(!vis[v][u.y+1])
51                     vis[v][u.y+1]=true,q.push((node){v,u.y+1});
52             }
53         }
54     }
55     int res=2147483647;
56     for(int i=0;i<=k;i++)
57         res=min(res,dis[n][i]);
58     return res;
59 }
60 int main()
61 {
62     scanf("%d %d %d",&n,&p,&k);
63     for(int i=1;i<=p;i++)
64     {
65         int a,b,c;
66         scanf("%d %d %d",&a,&b,&c);
67         add(a,b,c),add(b,a,c);
68     }
69     int ans=spfa();
70     if(ans>11000000)
71         printf("-1");
72     else
73         printf("%d",ans);
74     return 0;
75 }

水果店:

题目:

在一个市上,存在着很多的空地和住宅。现在,城市中新开了一个水果店,为了向城市居民问好,水果店决定派两个送货员向每一处住宅送一箱水果。由于一箱水果的重量很大,所以送货员每次只能携带一箱水果。

你可以把这个城市看成一个N行M列的棋盘,每个格子要么是空地,要么是住宅,要么是水果店。如果这个格子是一个空地,那就用0..9来表示这个空地的高度;如果是住宅,那么就用$来表示,如果是水果店,那么就用X来表示。从一个格子进入另一个格子,当且仅当两个格子相邻,也就是说共享一条边。

如果两个格子中有一个是住宅或水果店,那么需要花费2分钟的时间。

如果两个格子都是空地,那么就按高度来讨论时间。如果两个空地的高度相同,则花费1分钟的时间;如果两者的高度差1,则花费3分钟的时间;如果两者的高度超过1,那么不能互相进入。

现在,水果店的老板想知道,如果让整个城市的住宅都收到自己的水果,最短需要多少时间呢?如果永远无法送到,请输出-1。

思路:

先建一个网格图,跑一遍spfa(数据很小),预处理水果店到住宅所需的时间,乘上2,暴搜出最佳答案,在减去两个最长的时间即可。

要注意细节!!

code:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<queue>
  5 #define N 210
  6 using namespace std;
  7 const int dx[4]={1,-1,0,0};
  8 const int dy[4]={0,0,1,-1};
  9 int abs(int x){if(x<0)return -x;return x;}
 10 char map[N+1][N+1];
 11 int sx,sy;
 12 int tx[N+1],ty[N+1],cnt;
 13 int st[N+1][N+1],tot;
 14 struct edge
 15 {
 16     int x,y,last,val;
 17 }e[N*N<<1|1];
 18 void add(int x,int y,int a,int b,int c)
 19 {
 20     e[++tot].x=a,e[tot].y=b;
 21     e[tot].val=c;
 22     e[tot].last=st[x][y];
 23     st[x][y]=tot;
 24 }
 25 int dis[N+1][N+1];
 26 bool vis[N+1][N+1];
 27 struct node
 28 {
 29     int x,y;
 30 };
 31 void spfa()
 32 {
 33     queue<node> q;
 34     q.push((node){sx,sy});
 35     memset(dis,0x3f,sizeof(dis));
 36     dis[sx][sy]=0;
 37     while(!q.empty())
 38     {
 39         node u=q.front();
 40         vis[u.x][u.y]=false;
 41         q.pop();
 42         for(int i=st[u.x][u.y];i!=0;i=e[i].last)
 43         {
 44             node v=(node){e[i].x,e[i].y};
 45             if(dis[u.x][u.y]+e[i].val<dis[v.x][v.y])
 46             {
 47                 dis[v.x][v.y]=dis[u.x][u.y]+e[i].val;
 48                 if(!vis[v.x][v.y])
 49                     vis[v.x][v.y]=true,q.push((node){v.x,v.y});
 50             }
 51         }
 52     }
 53 }
 54 bool flag[N+1];
 55 int ans=2147483647;
 56 void dfs(int h)
 57 {
 58     int sum1=0,sum2=0,max1=0,max2=0;
 59     for(int i=1;i<=cnt;i++)
 60     {
 61         if(flag[i])
 62             sum1+=dis[tx[i]][ty[i]]<<1,max1=max(max1,dis[tx[i]][ty[i]]);
 63         else
 64             sum2+=dis[tx[i]][ty[i]]<<1,max2=max(max2,dis[tx[i]][ty[i]]);
 65     }
 66     if(sum1==0)
 67         ans=min(ans,sum2-max2);
 68     if(sum2==0)
 69         ans=min(ans,sum1-max1);
 70     if(sum1!=0&&sum2!=0)
 71         ans=min(ans,max(sum1-max1,sum2-max2));
 72     if(h>=cnt+1)
 73         return;
 74     flag[h]=true;
 75     dfs(h+1);
 76     flag[h]=false;
 77     dfs(h+1);
 78 }
 79 int main()
 80 {
 81 //    freopen("水果店.in","r",stdin);
 82     int n,m;
 83     scanf("%d %d",&n,&m);
 84     for(int i=1;i<=n;i++)
 85         scanf("%s",map[i]+1);
 86     for(int i=1;i<=n;i++)
 87         for(int j=1;j<=m;j++)
 88         {
 89             if(map[i][j]==‘$‘)
 90                 tx[++cnt]=i,ty[cnt]=j;
 91             if(map[i][j]==‘X‘)
 92                 sx=i,sy=j;
 93             for(int k=0;k<4;k++)
 94             {
 95                 int dex=i+dx[k],dey=j+dy[k];
 96                 if(dex<=0||dex>n||dey<=0||dey>m)
 97                     continue;
 98                 if(map[dex][dey]==‘X‘||map[dex][dey]==‘$‘)
 99                     add(i,j,dex,dey,2),add(dex,dey,i,j,2);
100                 else
101                     if(abs((int)(map[dex][dey]-map[i][j]))==1)
102                         add(i,j,dex,dey,3);
103                     else
104                         if(map[dex][dey]==map[i][j])
105                             add(i,j,dex,dey,1);
106             }
107         }
108     spfa();
109     if(cnt==0)
110     {
111         printf("0");
112         return 0;
113     }
114     for(int i=1;i<=cnt;i++)
115         if(dis[tx[i]][ty[i]]>10000000)
116         {
117             printf("-1");
118             return 0;
119         }
120 //    for(int i=1;i<=cnt;i++)
121 //        printf("%d %d %d %d %d\n",sx,sy,tx[i],ty[i],dis[tx[i]][ty[i]]);
122     dfs(1);
123     printf("%d",ans);
124     return 0;
125 }

总结:

今天的题很水,很水,很水。但我只拿了226分,哎╮(╯▽╰)╭。

还要继续加油。

原文地址:https://www.cnblogs.com/ouzijun-OJ/p/11519006.html

时间: 2024-10-07 23:13:24

三鑫普及组模拟赛的相关文章

计蒜客普及组模拟赛

今天没事闲的看到计蒜客有个普及组模拟赛,就当练了练手去打了,成绩低的可怜...400分崩成280分AK梦想化作泡影 第一题 同学的爱好 链接:https://nanti.jisuanke.com/t/17291 小学应用题难度?大概画个图就能懂,把每个部分都标上号,算出a,b,c,d,e,f的部分,进行运算就行了. 不多解释了,直接上代码 #include<iostream> #include<cstdio> #include<algorithm> #include&l

ZROI 普及组模拟赛02总结

ZROI 普及组模拟赛02总结 先放[网址][http://zhengruioi.com/contest/96] 可能是有一段时间没有打这种正式的比赛了,今天打的很奇怪... T1 模拟水题 既然是普及组模拟赛T1还是比较良心的 20分钟就过掉了 T2 <论不仔细观察题目导致的惨案> 没有发现莫尔斯电码非常的全 所以应该枚举哪些不行,而不是枚举26个字母 但是根据计算\(2*26*1e6\)也能跑过去啊 不知道为什么就是超时了... 最可笑的是还卡了20min的常数,还自己造了几组1e6的数据

2018 蓝桥杯省赛 B 组模拟赛(一)

2018 蓝桥杯省赛 B 组模拟赛(一) A.今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”. 花椰妹看大家一脸懵逼,就知道大家也不知道蒜头君的年龄,便连忙补充道:“我的年龄是蒜头君个位数和十位数之和的三倍”. 请你计算:蒜头君和花椰妹年龄一共有多少种可能情况? 提醒:两位的年龄都是在 [10,100)[10,100) 这个区间内. 题解: 暴力枚举 answer: 1 代码如下: #

ZROI提高组模拟赛05总结

ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生生把一个弱智题变成了一个不可做题 最后竟然在转化两次后的模型上以为自己做出来了 这个题比别人多花的1h左右的时间,而且只得到了30分,成为了这场比赛失败的关键因素 T2 依旧是一道简单题 有人20min之内就A掉了 感觉放在CF里最多算一道Div2 D,还是简单的那种 可是我又一次想复杂了 大意就是

2014-10-18 noip提高组模拟赛(codecomb)[未填]

> <看了一下觉得挺难的...除了T2 T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下!) T2贪心..很容易看出的 T3感觉题目没有怎么看懂...> <正解居然是树形dp 果然不太会 T4蒟蒻> <我连最小子矩阵都不会求T_T其他更不用说了 虽然没有参加比赛,但感觉自己到不了200(hzwer说没有200应该去参加普及组QAQ) 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 而且T1以为是

提高组模拟赛总结(1)

T1 : 题意:给定一个连续的颜色序列,至多可以去掉k种颜色,问能得到的最大连续单个颜色长度是多少 n <= 10 ^ 5 做法:考试的时候十分斯波,在统计的时候写了线段树统计,实际上根本不用 维护了两个指针表示当前的序列,离散化后用桶维护每一个颜色的数量,如果颜色 <= k + 1就一直加颜色进来,不然就一直移动左指针删除颜色,每次改变某一颜色数量时更新一下最大值就好了 T2: 题意:(实在没办法总结一句话题意了ORZ,总之是个变种的Lis)有 n 个节目,其描述了在 Ti时 刻 Xi号社团

10-18 noip提高组模拟赛(codecomb)T2贪心

T2:找min:一直找最小的那个,直到a[i]-x+1小于0,就找次小的,以此类推: 求max,也是一样的,一直到最大的那个,直到次大的比之前最大的大,就找次大的: 这个模拟,可以用上priority_queue: #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <queue> using namespace std; c

提高组模拟赛总结(3)

貌似是tyvj 2012年的题? T1:给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点.绿豆蛙从起点出发,走向终点. 到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K . 现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少? 刚看到题目,歪歪斜斜的每页上都写着'水题'几个字.我横竖睡不着,仔细看了半夜,才从字缝里看出字来,满本都写着一个字是'坑'!" 显然

提高组模拟赛总结(2)

T1: 题意:给定一个01背包,求将背包装到不能再放任何剩余物品的方案数 做法:部分分 F[j][k]表示前i个物品分配j空间,最小没有使用的物品为k的方案数 F[j][k] = Max(F[j-w[i]][k] + a[i], F[j][k]) 实际上并不需要枚举k,显然物品越重其前面必选的物品就越多,能提供的决策就越少,考虑对物品从大到小排序,此时如果取了第i个物品,i+1 .. n必然要被选择到,如果此时剩下的钱刚好放不下i且放得下 i - 1,那就说明 i 就是没有使用的最小的物品,可以