zoukankan      html  css  js  c++  java
  • 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^12T<=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
    ",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<=10n<=20000wi<=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
    ",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<=2000001<=ai<=nai 互不相同。

    代码如下:60分

     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 }
  • 相关阅读:
    jquery的ztree操作
    原创-使用pywinauto和swapy-ob-0.4.3进行dotnet的winform程序控制(二)
    原创-使用pywinauto进行dotnet的winform程序控制(一)
    javascript“命名空间”的费曼输出[原创]
    IIS7上传4M文件以上文件出现“Post大小超出允许的限制”错误解决方法
    OpenProj打开不了或者提示”Failed to load Java VM Library”的错误的解决方案
    项目管理中,开始到完成、完成到开始、开始到开始、和完成到完成的关系图解
    我的项目管理之干系人分析在单位项目中的运用
    关于学习js的Promise的心得体会
    vue.js与后台模板引擎“双花括号”冲突时的解决办法
  • 原文地址:https://www.cnblogs.com/Beginner-/p/7792687.html
Copyright © 2011-2022 走看看