今天ac了两道题,上午做了一道数学题,做的时候总体思路是对的但是解题思路有点错误所以给解题造成了很大的麻烦,废了很大的功夫,然后下午写第二道题,写着写着发现杭电关了,然后写完之后还是没打开,无奈之下看了看单调队列的课件。
1.Expanding Rods(数学问题):
题目大意:题意是一根长度为L的木棒,加热n度之后长度变为L'=(1+n*C)*L,其中C是木棒的热膨胀系数。给出L,n,C。求木棒在加热前后中心点的距离是多少。
代码:#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
double l0,l,r,h,n,k,low,high,mid;
int judge(double h)
{
r=(l*l)/(8.0*h)+h/2.0;
if(2.0*r*asin(l/(r*2.0))<l0)
return 0;
return 1;
}
int main()
{
while(cin>>l>>n>>k)
{
if(l<0&&n<0&&k<0)
break;
l0=(1.0+n*k)*l;
low=0.0;
high=l/2.0;
while(low+0.000001<high)
{
mid=(low+high)/2.0;
if(judge(mid))
high=mid;
else
low=mid;
}
cout<<fixed<<setprecision(3)<<low<<endl;
}
return 0;
}
题后总结:这个题刚看的时候毫无头绪,感觉无从下手,然后就开始想,在演草纸上画,一个小时之后画着画着忽然想到可以用圆的知识来解题,然后看到题目上写的增长的部分为圆形,这一个要求就保证了我的想法是对的,然后我的想法把原来木棒的中心看成(0,0)点,然后找到圆点,然后通过求出圆点与木棒一个端点的长度确定出来半径,然后减去(0,0)点与圆点的距离就是想求的木棒中点移动的长度,但是想了很久最终也没想出来圆点该怎么确定,最后真的是想不出来了,看了一下别人的解题思路,他们并不是求圆点,可能是我一开始思路就错了,所以怎么想都不会有结果,也可能是我的知识不足,用这种方法解不出来。一上午搞这个题搞的头都快炸了。
2.Drying:
题目大意:有一些衣服,每件衣服有一定水量,有一个烘干机,每次可以烘一件衣服,每分钟可以烘掉k滴水。每件衣服没分钟可以自动蒸发掉一滴水,用烘干机烘衣服时不蒸发。问最少需要多少时间能烘干所有的衣服。
代码:#include<stdio.h>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
long long a[100100],l,r,mid;
long long n,k;
int judge(long long mid)
{
long long sum=0;
for(int i=0;i<n;i++)
{
if(a[i]<=mid)
continue;
sum+=(ceil((a[i]-mid)*1.0/(k-1)));
}
return sum>mid;
}
int main()
{
while(scanf("%I64d",&n)!=EOF)
{
memset(a,0,sizeof(a));
long long maxx=-1,ans=0;
for(int i=0;i<n;i++)
{
scanf("%I64d",&a[i]);
maxx=max(maxx,a[i]);
}
cin>>k;
if(k==1)
{printf("%I64d\n",maxx);
continue;}
l=0;
r=maxx;
while(l<=r)
{
mid=(l+r)/2;
if(judge(mid))
l=mid+1;
else
{r=mid-1;
ans=mid;}
}
printf("%I64d\n",ans);
}
}
题后感想:在judge函数用到了ceil函数,刚开始我用的int但是不对,然后找到了ceil这个函数,然后有看到了floor函数,放在这里正好适用,这里必须要用ceil函数,因为这里只要大于这个整数一点点就得往上进一,一开始用c语言超时,后来改成了c++。
ceil函数:ceil(n)的意思是向正方向舍入,这一点要与floor(n)向负方向舍入一起讲,能够更好的区分,举例说明:
ceil(pi)=4; ceil(3.5)=4; ceil(-3.2)=-3;向正方向舍入
floor(pi)=3; floor(3.5)=3; floor(-3.2)=-4;向负方向舍入