• 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
    ",sum_white*x);
    52         else
    53         {
    54             printf("%d
    ",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**
    ",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
    ",(ans-1)*2+1);
                }
                else printf("%I64d
    ",ans*2+1);
            }
        }
        return 0;
    }
     
  • 相关阅读:
    2015.4.16-C#中ref和out的区别
    2015.4.10-SQL 高级查询(二)
    2015.4.10-C#入门基础(三)
    2015.4.8-C#入门基础(二)
    2015.4.7-C#入门基础(一)
    2015.4.2-SQL 简单语句(一)
    对GridView的某一列行进行操作。。
    jquery获取GridView中RadioButton选中的数据
    Ajax获取前台的数据
    前台验证
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13361218.html
Copyright © 2020-2023  润新知