20170906ditoly的信心大赛(╥╯^╰╥)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20170906ditoly的信心大赛(╥╯^╰╥)相关的知识,希望对你有一定的参考价值。
T1:切糕(cut)
【问题描述】
小R意外获得了一块切糕,他准备把切糕分给n个小伙伴。切糕的形状是一个底边长为a,高为b的等腰三角形。小R打算横着或竖着切n-1刀把切糕切成面积相等的n块分给小伙伴,请你告诉他要在哪些地方切。
【输入格式】
输入文件cut.in
输入包含四个整数n,a,b,c,表示要切成n块,切糕的三个顶点分别位于(0,0),(a,0),(a/2,b),若c=0,表示要横着切;若c=1,表示要竖着切。
【输出格式】
输出文件cut.out
输出共n-1行,每行一个实数,从小到大输出各切割处的位置,若c=0,每输出一个整数a,表示在直线y=a处切一刀;若c=1,每输出一个整数a,表示在直线x=a处切一刀。当你的输出与标准输出的绝对误差不超过时,判为正确。
【样例输入1】
3 5 2 0
【样例输出1】
0.3670068381
0.8452994616
【样例输入2】
2 5 3 1
【样例输出2】
2.5
【数据范围】
对于全部数据,2<=n<=1000,1<=a,b<=10^5;
对于50%的数据,c=0;
对于另外50%的数据,c=1。
solution:数学问题,开方完再用a,b关系。注意精度。WA50%的原因是之后输出反了,mmp。
提醒:不要手写sqrt╮(╯﹏╰)╭。
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main() { //freopen("cut.in","r",stdin); //freopen("cut.out","w",stdout); double s=1; int n,a,b,c; scanf("%d%d%d%d",&n,&a,&b,&c); s/=n; if(c==0) { for(int i=n-1;i>=1;i--) printf("%.10f\n",b-sqrt(i*s*b*b)); } if(c==1) { s/=2; bool m=n&1?0:1; for(int i=1;i<=n/2;i++) printf("%.10f\n",sqrt(i*s*a*a)); for(int i=(n-1)/2;i>=1;i--) printf("%.10f\n",a-sqrt(i*s*a*a)); } return 0; }
T2:采购(buy)
【问题描述】
小R有一个爱好,他经常去杂货市场上采购一些奇奇怪怪的物品。今天小R来到市场,发现有n个摊位,每个摊位出售不同的货物,第i个摊位出售的货物价格为ai。这些摊位的老板很奇怪,他们不喜欢你购买其他摊位的物品,如果你购买了k件其他摊位的物品,你在购买第i个摊位出售的物品时需要额外支付k*bi的钱,为了防止你买完一个摊位的物品后再去买另一家的物品,他们商量好要求你同时结账,现在小R有m元钱,他想知道自己最多能买多少种不同的物品。
【输入格式】
输入文件buy.in
第一行两个正整数n和m,表示摊位数和小R的钱数。
接下来n行,每行两个非负整数ai,bi,意义同问题描述。
【输出格式】
输出文件buy.out
输出一个非负整数,表示答案。
【样例输入】
3 7
1 3
2 1
3 0
【样例输出】
2
【数据范围】
对于20%的数据,n<=20;
对于40%的数据,n<=1000;
对于另外10%的数据,bi=0;
对于另外20%的数据,所有bi均相等;
对于100%的数据,n,ai,bi<=100,000,m<=10^9。
solution:二分答案,我原来以为是背包,结果数据太强大。。。
#include<cstdio> #include<algorithm> using namespace std; int a[100005],b[100005]; long long c[100005],s; int main() { int n,m,i,l,r,mid,ans; scanf("%d%d",&n,&m); for(i=1;i<=n;++i)scanf("%d%d",&a[i],&b[i]); for(l=0,r=n;l<=r;) { mid=(l+r)/2; for(long long i=1;i<=n;++i)c[i]=i*b[i]*(mid-1)+a[i]; sort(c+1,c+n+1); for(s=0,i=1;i<=mid;++i)s+=c[i]; if(s<=m)ans=mid,l=mid+1; else r=mid-1; } printf("%d",ans); return 0; }
T3:能量(power)
【问题描述】
小R在某次杂货采购中买到了n个XOR能量石,每个能量石有一个能量系数ai和共鸣系数bi,其中能量系数决定了能量石的好坏。小R想知道这些能量石的品质,但能量系数无法简单观测得到,只有通过能量共鸣仪促使能量石之间发生共鸣,才有办法获知能量系数。能量共鸣仪每次可以使一个区间内的所有能量石发生共鸣,并且获知这些能量石能量系数的异或和,但需要消耗等同于区间内所有能量石共鸣系数异或和的能量。小R已经测量出了各个能量石的共鸣系数,现在他想知道至少需要多少能量才能确定所有能量石的能量系数。
【输入格式】
输入文件power.in
第一行一个正整数n,表示能量石的个数。
第二行n个整数bi,表示各个能量石的共鸣系数。
【输出格式】
输出文件power.out
输出一个整数,表示最小的能量花费。
【样例输入】
2
1 3
【样例输出】
3
【数据范围】
对于20%的数据,n<=10;
对于50%的数据,n<=100;
对于70%的数据,n<=1,000;
对于100%的数据,n<=10,000,0<=bi<2^31。
#include<cstdio> #include<algorithm> using namespace std; inline int read() { int x;char c; while((c=getchar())<‘0‘||c>‘9‘); for(x=c-‘0‘;(c=getchar())>=‘0‘&&c<=‘9‘;)x=x*10+c-‘0‘; return x; } #define MN 10000 int a[MN+5],d[MN+5],u[MN+5]; int main() { freopen("power.in","r",stdin); freopen("power.out","w",stdout); int n=read(),i,j,mn;long long ans=0; for(i=1;i<=n;++i)d[i]=a[i]=a[i-1]^read(); for(i=1;i<=n;++i) { for(mn=0,j=1;j<=n;++j)if(!u[j]&&(!mn||d[j]<d[mn]))mn=j; ans+=d[mn];u[mn]=1; for(j=1;j<=n;++j)d[j]=min(d[j],a[j]^a[mn]); } printf("%lld",ans); fclose(stdin);fclose(stdout);return 0; }
以上是关于20170906ditoly的信心大赛(╥╯^╰╥)的主要内容,如果未能解决你的问题,请参考以下文章
20170906xlVBA_RecursionGetFiles