Educational Codeforces Round 88 (Rated for Div. 2) B、New Theatre Square C、Mixing Water

题目链接:B、New Theatre Square

 

题意:

你要把所有“.” 都变成“*”,你可以有两个选择,第一种就是一次铺一个方块(1*1),第二种就是同一行一次铺两个(1*2)。第一种花费x,第二种花费y。问最少花费多少能把所有铺完

 

题解:

如果y>=2*x,那么就直接找到所有“.”,然后乘于x就行

否则就找俩俩一对就行了

 

代码:

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string>
 5 #include<queue>
 6 #include<deque>
 7 #include<string.h>
 8 #include<map>
 9 #include <iostream>
10 #include <math.h>
11 #define Mem(a,b) memset(a,b,sizeof(a))
12 const double II = acos(-1);
13 const double PP = (II*1.0)/(180.00);
14 using namespace std;
15 typedef long long ll;
16 const int INF=0x3f3f3f3f;
17 const int maxn=1000+10;
18 char s[maxn][maxn];
19 int main()
20 {
21     int t;
22     scanf("%d",&t);
23     while(t--)
24     {
25         int n,m,x,y;
26         scanf("%d%d%d%d",&n,&m,&x,&y);
27         for(int i=1; i<=n; ++i)
28             scanf("%s",s[i]+1);
29         int sum_white=0,sum=0;
30         for(int i=1; i<=n; ++i)
31         {
32             for(int j=1; j<=m; j++)
33             {
34                 if(s[i][j]=='*') continue;
35                 if(s[i][j]=='.' && s[i][j+1]=='.')
36                 {
37                     sum_white+=2;
38                     sum+=y;
39                     j++;
40                     continue;
41                 }
42                 else
43                 {
44                     sum_white++;
45                     sum+=x;
46                     j++;
47                 }
48             }
49         }
50         if(2*x<=y)
51             printf("%d\n",sum_white*x);
52         else
53         {
54             printf("%d\n",sum);
55         }
56     }
57     return 0;
58 }
View Code

 

 

题目链接:C、Mixing Water

 

题意:

往一个无限深的桶里面倒水,先倒入热水再倒入凉水,热水温度h,凉水温度c。给你一个温度n,问你倒多少次水才可以是水桶内温度最接近n

 

题解:

如果倒入水的次数是偶数,那么温度一直是 (h+c)/2

如果倒入水次数是奇数,会得到水桶内温度 y=((x+1)*h+c*x)/(2*x+1) (x是倒入凉水次数)

可见如果将x只取奇数(1,3,5,7...)那么这就是一个单调递减函数。所以二分求解就可以了

 

也可以这样理解,你倒入x杯凉水和x杯热水之后温度是(h+c)/2,那么你有多倒入一杯热水,那么这杯热水的温度肯定被所有杯水平分,那么x越大,每单独一杯分配到的水温越小

 

代码:

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<deque>
#include<string.h>
#include<map>
#include <iostream>
#include <math.h>
#define Mem(a,b) memset(a,b,sizeof(a))
const double II = acos(-1);
const double PP = (II*1.0)/(180.00);
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1000+10;
const double eps=1e-6;
const double PI=acos(-1);
ll h,c,t;
int main()
{
    ll tt;
    cin>>tt;
    while(tt--)
    {
        cin>>h>>c>>t;
        if(h+c>>1>=t)
        {
            cout<<2<<endl;
        }
        else
        {
            //ll x=(h-t)*1.0/(2*t-h-c);
            //cout<<(fabs(t-get(x))<=fabs(t-get(x+1))?2*x+1:2*x+3)<<endl;
            ll l=0,r=1e9,ans=0;
            while(l+1<r)
            {
                //printf("%I64d %I64d**\n",l,r);
                ll mid=l+r>>1;
                //if(mid%2!=0)  mid--;
                double temp=((h+c)*mid*1.0+h)/(mid*2.0+1.0);
                if(temp>=t)
                {
                    ans=mid;
                    l=mid;
                }
                else
                {
                    r=mid;
                }
            }
            double temp1=((h+c)*ans*1.0+h)/(ans*2.0+1.0);
            ans++;
            double temp2=((h+c)*ans*1.0+h)/(ans*2.0+1.0);
            if(fabs(temp1-t)<=fabs(t-temp2))
            {
                printf("%I64d\n",(ans-1)*2+1);
            }
            else printf("%I64d\n",ans*2+1);
        }
    }
    return 0;
}
 

 

posted @ 2020-07-22 15:52  kongbursi  阅读(182)  评论(0编辑  收藏  举报