2017/11/3模拟赛

块(block
【问题描述】
拼图达人小 C 手里有 n 个 1*1 的正方形方块, 他希望把这些方
块拼在一起, 使得拼出的图形周长最小, 要求方块不能重叠。 擅长拼
图的小 C 一下就求出了这个周长, 顺便他想考考你会不会求。
【输入格式】
多组数据, 第一行一个正整数 T, 表示数据组数。
接下来 T 行, 每行一个正整数 n, 表示方块数。
【输出格式】
输出 T 行, 每行一个正整数, 表示答案。
【样例输入】
3 4 1
1
22
【样例输出】
8
14
20
【数据范围】
对于 20%的数据, n<=20;
对于 40%的数据, n<=1000;
对于 60%的数据, n<=10^6;
对于 80%的数据, n<=10^10;
对于 100%的数据, n<=10^12, T<=10。

题解:二分答案即可。

代码如下:

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 long long n,l,r,mid,ans;
 5 bool check(long long x){
 6     x>>=1;
 7     if(x&1){
 8         long long t1=x>>1,t2=(x>>1)+1;
 9         return t1*t2>=n;
10     }
11     return (x>>1)*(x>>1)>=n;
12 }
13 int main()
14 {
15     freopen("block.in","r",stdin);
16     freopen("block.out","w",stdout);
17     int T; scanf("%d",&T);
18     while(T--){
19         scanf("%lld",&n);
20         l=1; r=1e9;
21         while(l<=r){
22             mid=l+r>>1;
23             if(check(mid)) r=mid-1,ans=mid;
24             else l=mid+1;
25         }
26         printf("%lld\n",ans);
27     }return 0;
28 }

树(tree
【问题描述】
今天 F 大爷看到了一张 n 个点的无向完全图, 每条边有边权。 F
大爷一开心就花 0.03 飞秒(即3*10-17 秒) 求了一下这张图的最小生
成树以及最小生成树的个数。 F 大爷惊喜地发现这张图只有一个最小
生成树, 他现在更开心了, 于是他把这个最小生成树告诉了你, 要你
求出原来的完全图中边权和最小是多少。
【输入格式】
多组数据, 第一行一个正整数 T, 表示数据组数。
每组数据的第一行一个正整数 n, 表示点数。
接下来 n-1 行, 每行三个正整数 xi,yi,wi, 表示最小生成树上 xi
和 yi 之间有一条权值为 wi 的边。
【输出格式】
输出 T 行, 每行一个整数, 表示答案。
【样例输入】
2 3 1
2 4
2 3 7
4 1
2 1
1 3 1
1 4 2
【样例输出】
19
12
【数据范围】
对于 20%的数据, T,n,wi<=5;
对于另外 30%的数据, n<=1000, 给的树是一条链;
对于 100%的数据, T<=10, n<=20000, wi<=10000。

题解:首先把边从小到大排序,然后按顺序合并,假设2个完全图合并,那么答案就+=2个完全图点数之积*(边权+1)-1。

代码如下:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #define MN 20005
 5 using namespace std;
 6 long long ans;
 7 int n,fa[MN],siz[MN];
 8 struct node{int u,v,w;}e[MN];
 9 bool cmp(node a,node b){return a.w<b.w;}
10 int ff(int u){return fa[u]==u?u:fa[u]=ff(fa[u]);}
11 void unite(int u,int v,int w){
12     u=ff(u); v=ff(v);
13     ans+=1LL*siz[u]*siz[v]*(w+1)-1;
14     fa[u]=v; siz[v]+=siz[u];
15 }
16 int main()
17 {
18     freopen("tree.in","r",stdin);
19     freopen("tree.out","w",stdout);
20     int T; scanf("%d",&T);
21     while(T--){
22         scanf("%d",&n); ans=0;
23         for(int i=1;i<=n;i++) fa[i]=i,siz[i]=1;
24         for(int i=1;i<n;i++)
25             scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
26         sort(e+1,e+n,cmp);
27         for(int i=1;i<n;i++)
28             unite(e[i].u,e[i].v,e[i].w);
29         printf("%lld\n",ans);
30     }
31 }

球(ball
【问题描述】
有 n 个不同颜色的球排成一排, 其中 n 为偶数。 小 D 打算把这
些球按照某种玄妙的顺序放入一个球筒中。每次他会选择一个不是当
前第一个的球, 先把这个球放入球筒, 接着把这个球的前一个也放入
球筒, 重复这个操作直到所有球都进入球筒。 小 D 希望最后球筒中
从顶到底的颜色序列字典序最小, 但他不会做, 所以请你帮帮他。
【输入格式】
第一行一个正整数 n, 表示球的个数。
第二行 n 个正整数 ai, 分别表示每个球的颜色。
【输出格式】
输出一行 n 个正整数, 表示球筒字典序最小的颜色序列。
【样例输入 1】
4 3
2 4 1
【样例输出 1】
3 1 2 4
【样例输入 2】
8 4
6 3 2 8 5 7 1
【样例输出 2】
3 1 2 7 4 6 8 5
【数据范围】
对于 30%的数据, n<=10;
对于 60%的数据, n<=1000;
对于 100%的数据, n<=200000, 1<=ai<=n, ai 互不相同。

代码如下:

 1 #include<cstdio>
 2 #include<iostream>
 3 #define MN 200005
 4 int a[MN],n;
 5 bool b[MN];
 6 int main()
 7 {
 8     freopen("ball.in","r",stdin);
 9     freopen("ball.out","w",stdout);
10     scanf("%d",&n);
11     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
12     a[0]=0x7fffffff;
13     for(int i=1;i<=n/2;i++){
14         int t1=0,t2=0;
15         bool f=false;
16         for(int j=1;j<=n;j++)
17             if(!b[j]){
18                 f=f?0:1;
19                 if(f&&a[j]<a[t1]) t1=j;
20             }
21         b[t1]=true; f=false;
22         for(int j=t1+1;j<=n;j++)
23             if(!b[j]){
24                 f=f?0:1;
25                 if(f&&a[j]<a[t2]) t2=j;
26             }
27             else break;
28         b[t2]=true;
29         printf("%d %d ",a[t1],a[t2]);
30     }
31     return 0;
32 }
时间: 2024-10-14 09:54:47

2017/11/3模拟赛的相关文章

2017/11/1模拟赛

磁星(magnet)[题目描述]在 B 城呆惯了的小 H 决定去外太空溜达一圈.人类现已发现并开发的星球(包括小 H 所在的星球)有 n 个,并且在这 n 个星球之中,人们发现了 m 对两个星球的关系.关系"xy"表示的是星球 x 对星球 y 有 1 一个单位的引导力,由于引导力还具有传递性,如果星球 x 对星球 y 能有恰好 a 个单位的引导力,星球y 对星球 z 能有恰好 b 个单位的引导力,那么星球 x 对星球 z 就能有恰好 a+b 个单位的引导力. 换言之,星球 x 对星球

2017 11 6模拟赛T1

作为一个毒瘤出题人(wzy:我不是毒瘤出题人,这些题明明很水的),wzy的题干十分复杂,但是把题意简化之后,相当简单粗暴... 求首项为1,等比为m,项数为t的等比数列的和,答案对k取模 不保证m与k互质 如果m与k互质的话,用等比数列的求和公式在求个逆元就能解决了,但是本题显然不能,于是必须考虑不含有除法的算法 于是就有了分治求等比数列和的办法. 设s(x)为等比数列的第n项 由等比数列的性质得到s(y)=s(x)*m^(y-x) (y>x) 将一个长度为2r的等比数列拆分成登场的两部分,对应

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

11.27 模拟赛

并没有人做的模拟赛... 出题人hx,,, T1:就是上一道矩阵乘法 数学题 T2: 一个数列中 一个区间满足,存在一个k(L <= k <= R),并且对于任意的i (L <= i <= R),ai都能被ak整除 这样的一个特殊区间 [L, R]价值为R - L 想知道序列中所有特殊区间的最大价值是多少,而有多少个这样的区间呢 这些区间又分别是哪些呢 输出每个区间的L 思路: 用两个ST表分别求一段区间的gcd和最小值 然后可以二分答案 check的时候枚举左端点,判断在这段区间

2017 7.22 模拟赛

最水的一次模拟赛.. 点击查看题目 T1 求最后K位  那前面的数是没有比要求的 , 我们就把 10k 作为模数 ,对答案进行取模 就好了  #include <ctype.h> #include <cstdio> #define N 100005 typedef long long LL; void read(LL &x) { x=0;bool f=0; register char ch=getchar(); for(;!isdigit(ch);ch=getchar())

11.4 模拟赛

终于AK了,虽然第三题主要是搞月想出来的 T1: n个1*1的小方块,把这些小方块拼成一个图形,使这个图形周长最小 思路: 枚举拼成长方形的长为i,宽为n/i 可得面积 (i+n/i+(bool)(n%i))*2 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cmath> 6 #include<cstr

2017 无奈的模拟赛

悲剧的开始~~~~ 竞赛时间:????年??月??日??:??-??:?? 题目名称 第二题 死亡 凝视 名称 two death eyesight 输入 two.in death.in eyesight.in 输出 two.out death.out eyesight.out 每个测试点时限 1 秒 1 秒 1 秒 内存限制 512MB 512MB 512MB 测试点数目 10 10 10 每个测试点分值 10 10 10 是否有部分分 无 无 无 题目类型 传统 传统 传统 注意事项(请务必

2017/9/13模拟赛

粉饰(decorate) [题目描述] 小D有一块被分为n*m个格子的矩形鱼片.为了装饰鱼片,小D决定给每个格子上色.由于小D很喜欢红白,所以小D给每个格子涂上了红色或白色,第i行第j列的格子颜色记为c[i,j].涂完之后,小D想评估这块鱼片的"XY值".我们定义一个有序无重复三元格子组{(x1,y1),(x2,y2),(x3,y3)}为"XY组"当且仅当: |(x1-x2)*(y1-y2)|+|(x3-x2)*(y3-y2)|=0   (c[x1,y1]-c[x2