zoukankan      html  css  js  c++  java
  • 【20170906校内模拟赛】

    所有题目开启-O2,评测机效率为4亿左右;

    T1 切糕(cut)

    Description

    小R意外获得了一块切糕,他准备把切糕分给n个小伙伴。切糕的形状是一个底边长为a,高为b的等腰三角形。小R打算横着或竖着切n-1刀把切糕切成面积相等的n块分给小伙伴,请你告诉他要在哪些地方切。

    Input

    输入文件 cut.in
    输入包含四个整数 n,a,b,c, 表示要切成 n 块, 切糕的三个顶点分别位于(0,0),(a,0),(a/2,b), 若 c=0, 表示要横着切; 若 c=1, 表示要竖着切。

    Output

    输出文件cut.out
    输出共n-1行,每行一个实数,从小到大输出各切割处的位置,若c=0,每输出一个整数a,表示在直线y=a处切一刀;若c=1,每输出一个整数a,表示在直线x=a处切一刀。当你的输出与标准输出的绝对误差不超过1e-6时,判为正确。

    Sample Input1

    3 5 2 0

    Sample Output1

    0.3670068381
    0.8452994616

    Sample Input2

    2 5 3 1

    Sample Output2

    2.5

    Hint

    对于全部数据,(2<=n<=1000,1<=a,b<=10^{5})
    对于50%的数据,c=0;
    对于另外50%的数据,c=1。

    Solution

    相似三角形即可解决。

    Code

    #include <stdio.h>
    #include <math.h>
    #define MN 1005
    #define eps 1e-10
    #define ld long double
    #define R register
    #define Filename "cut"
    inline int read(){
    	R int x; R bool f; R char c;
    	for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
    	for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
    	return f?-x:x;
    }
    int n,a,b,c; double aa,bb,ans[MN];
    int main(){
    #ifndef Debug
    	freopen(Filename".in","r",stdin);
    	freopen(Filename".out","w",stdout);
    #endif
    	n=read(),a=read(),b=read(),c=read();aa=a*1.0,bb=b*1.0;
    	if (c){
    		if (n&1) {
    			ans[n>>1]=0.5*aa*sqrt(1.0*(n-1.0)/(1.0*n));
    			ans[n+1>>1]=aa-ans[n>>1];aa=ans[n>>1];
    			for (R int i=(n>>1)-1; i; --i){
    				R double p=aa*sqrt(1.0*i/(n>>1));
    				ans[i]=p; ans[n-i]=1.0*a-p;
    			}
    		}else{
    			ans[n>>1]=aa=aa/2.0;for (R int i=(n>>1)-1; i; --i){
    				R double p=1.0*aa*sqrt(1.0*i/(n>>1));
    				ans[i]=p,ans[n-i]=a*1.0-p;
    			}
    		}
    	}else for (R int i=1; i<n; ++i){
    		R double p=1.0*b*sqrt(1.0*(n-i)/(1.0*n));
    		ans[i]=1.0*b-p;
    	}for (R int i=1; i<n; ++i) printf("%.10lf
    ",ans[i]);
    #ifndef Debug
    	fclose(stdin); fclose(stdout);
    #endif
    	return 0;
    }
    

    T2 采购(but)

    Description

    小R有一个爱好,他经常去杂货市场上采购一些奇奇怪怪的物品。今天小R来到市场,发现有n个摊位,每个摊位出售不同的货物,第i个摊位出售的货物价格为ai。这些摊位的老板很奇怪,他们不喜欢你购买其他摊位的物品,如果你购买了k件其他摊位的物品,你在购买第i个摊位出售的物品时需要额外支付k*bi的钱,为了防止你买完一个摊位的物品后再去买另一家的物品,他们商量好要求你同时结账,现在小R有m元钱,他想知道自己最多能买多少种不同的物品。

    Input

    输入文件buy.in
    第一行两个正整数n和m,表示摊位数和小R的钱数。
    接下来n行,每行两个非负整数ai,bi,意义同问题描述。

    Output

    输出文件buy.out
    输出一个非负整数,表示答案。

    Sample Input

    3 7
    1 3
    2 1
    3 0

    Sample Output

    2

    Hint

    对于20%的数据,n<=20;
    对于40%的数据,n<=1000;
    对于另外10%的数据,bi=0;
    对于另外20%的数据,所有bi均相等;
    对于100%的数据,(n,ai,bi<=100,000,m<=10^{9})

    Solution

    二分答案,转为判断性问题,然后sort一下暴力计算即可,时间效率(O(n log^{2}_{2} n))

    Code

    #include <stdio.h>
    #include <algorithm>
    #define MN 100005
    #define ll long long
    #define R register
    #define Filename "buy"
    inline int read(){
    	R int x; R bool f; R char c;
    	for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
    	for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
    	return f?-x:x;
    }
    int n,m,a[MN],b[MN],rk[MN],K;
    inline bool cmp(int x,int y){return 1ll*a[x]+(K-1)*b[x]<1ll*a[y]+(K-1)*b[y];}
    inline bool check(int ans){
    	for (R int i=1; i<=n; ++i) rk[i]=i;
    	K=ans;std::sort(rk+1,rk+n+1,cmp);R ll res=0;
    	for (R int i=1; i<=ans; ++i){
    		res+=1ll*a[rk[i]]+(ans-1ll)*b[rk[i]];
    		if (res>m) return 0;
    	}return 1;
    }
    int main(){
    #ifndef Debug
    	freopen(Filename".in","r",stdin);
    	freopen(Filename".out","w",stdout);
    #endif
    	n=read(),m=read();
    	for (R int i=1; i<=n; ++i) a[i]=read(),b[i]=read();
    	R int l=0,r=n;
    #define mid (l+r+1>>1)
    	while(l<r){
    		if (check(mid)) l=mid;
    		else r=mid-1;
    	}printf("%d",l);
    #ifndef Debug
    	fclose(stdin); fclose(stdout);
    #endif
    	return 0;
    }
    

    T3 能量(power)

    Description

    小R在某次杂货采购中买到了n个XOR能量石,每个能量石有一个能量系数ai和共鸣系数bi,其中能量系数决定了能量石的好坏。小R想知道这些能量石的品质,但能量系数无法简单观测得到,只有通过能量共鸣仪促使能量石之间发生共鸣,才有办法获知能量系数。能量共鸣仪每次可以使一个区间内的所有能量石发生共鸣,并且获知这些能量石能量系数的异或和,但需要消耗等同于区间内所有能量石共鸣系数异或和的能量。小R已经测量出了各个能量石的共鸣系数,现在他想知道至少需要多少能量才能确定所有能量石的能量系数。

    Input

    输入文件power.in
    第一行一个正整数n,表示能量石的个数。
    第二行n个整数bi,表示各个能量石的共鸣系数。

    Output

    输出文件power.out
    输出一个整数,表示最小的能量花费。

    Sample Input

    2
    1 3

    Sample Output

    3

    Hint

    对于20%的数据,n<=10;
    对于50%的数据,n<=100;
    对于70%的数据,n<=1,000;
    对于100%的数据,n<=10,000,(0<=bi<2^{31})

    Solution

    前缀和一下,然后跑个prim就行了,时间效率(O(n^{2})).

    Code

    #include <stdio.h>
    #define MN 10005 
    #define R register
    #define min(a,b) ((a)<(b)?(a):(b))
    #define Filename "power"
    inline int read(){
    	R int x; R bool f; R char c;
    	for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
    	for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
    	return f?-x:x;
    }
    int num[MN],f[MN],n;bool u[MN];long long ans;
    int main(){
    #ifndef Debug
    	freopen(Filename".in","r",stdin);
    	freopen(Filename".out","w",stdout);
    #endif
    	n=read();for (R int i=1; i<=n; ++i) f[i]=num[i]=read()^num[i-1];f[n+1]=0x7fffffff;
    	for (R int i=1; i<=n;  ++i){
    		R int res=n+1;for (R int j=1; j<=n; ++j) if (!u[j]&&f[j]<f[res]) res=j;
    		u[res]=1;ans+=1ll*f[res];
    		for (R int j=1; j<=n; ++j) f[j]=min(f[j],num[j]^num[res]);
    	}printf("%lld",ans);
    #ifndef Debug
    	fclose(stdin); fclose(stdout);
    #endif
    	return 0;
    }
    
  • 相关阅读:
    解决android运行速度慢的问题
    nginx配合tomcat、resin等java应用服务器提供java支持(转)
    部分面向对象习题,留给学生做不错!!!
    该内存不能为“read”或“written”
    ORACLE数据库管理系统体系结构详解
    Linux下设置ORACLE自启动
    Oracle静默安装模板
    python安装步骤
    Oracle删除重复索引
    windows操作系统下python IDLE安装
  • 原文地址:https://www.cnblogs.com/Melacau/p/7489129.html
Copyright © 2011-2022 走看看