2020.10.9--vj个人赛补题

B - A Tide of Riverscape

 题意:给出一组字符串,由‘0’,‘1’,‘ . ’组成,‘ . ’可以换成 0或1,判断第 i  个和第 i+p 个字符是否可以不相等,如果可以则输出满足条件的字符串

题解:先把所有的‘ . ’换成0或1,在判断 i 和i+p 以及i 和 i-p 是否一样,一样则把原来的‘ . ’换成相反的1 或0 ,最后判断是否有一组周期为p的点不同

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,p,i,j;
    cin>>n>>p;
    string s;
    cin>>s;
    int k=0;
    for(i=0;i<n;i++)
    {
        if(s[i]=='.')
        {
            s[i]='0';//将所有的点换成‘0’
            if(i+p<n&&s[i+p]=='0'||i-p>=0&&s[i-p]=='0')//判断两点是否一样
                s[i]='1';
        }
        if(i+p<n&&s[i]!=s[i+p])//判断是否有一组周期为p的点不同
        {
            k=1;
        }
    }
    if(k==1)
    {
        for(i=0;i<n;i++)
        {
            cout<<s[i];
        }
        cout<<endl;
    }
    else cout<<"No"<<endl;

}

E - High School: Become Human

题意:计算x^y与y^x的大小,如果两者相减误差非常小则等于输出“=”,如果x^y大于y^x则输出“>",如果小于则输出“<”;

题解:运用对数来比较,都化成以e为底的对数形式,xy  = e ln (x^y) =  e y(ln x) 

也可以使用其他形式的对数函数:

double log (double); 以e为底的对数
double log10 (double);c++中自然对数函数:log(N)  

以10为底:log10(N)

但没有以2为底的函数但是可以用换底公式解 决:log2(N)=log10(N)/log10(2)

/*double log (double); 以e为底的对数
double log10 (double);c++中自然对数函数:log(N)
 以10为底:log10(N)
但没有以2为底的函数但是可以用换底公式解 决:log2(N)=log10(N)/log10(2)*/
#include<bits/stdc++.h>
using namespace std;
const int esp=1e-9;//误差范围
int main()
{
    int x,y;
   scanf("%d%d",&x,&y);
   double a,b;//x^y: log(x^y)=y*log(x):以e为底的对数
   a=log(x)*y;
   b=log(y)*x;
   if(fabs(a-b)<=esp)cout<<"="<<endl;
   else if(a-b>0)cout<<">"<<endl;
   else cout<<"<"<<endl;

}

 F - Three displays

题意:

现在是2018年中期,玛丽亚·斯特帕诺夫娜(Maria Stepanovna)住在克拉斯诺卡芒斯克(Krasnokamensk, Zabaikalsky地区的一个小镇)郊外,她想租三个展板来突出一个重要问题。沿道路放置n个显示器,其中第i个显示器只能显示字体大小为si的文本。Maria Stepanovna想要租这样的三种显示器,带有 i<j<k 索引,如果你沿着道路沿着一个特定的方向移动,字体大小就会增加。也就是说,必须遵守 si<sj<sk 的条件。第i个显示器的租金是ci请确定Maria Stepanovna需要支付的最小费用。

第一行包含单个整数n(3≤n≤3000)-显示的数量。

第二行包含n个整数s1,s2,…,sn(1≤si≤109)-显示器上的字体大小,按它们沿道路排列的顺序排列。 

第三行包含n个整数c1,c2,…,cn(1≤ci≤108)-每个显示器的租金。

如果没有三个显示满足条件,则打印-1。否则打印一个整数-三个显示器的最低总租金成本指数 i<j<k,使 si<sj<sk。

题解:选取一个中间值进行比较,用min( , )依次选出第一个和最后一个符合条件的,最后选出总和最小的即可

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 3e3 + 100;
const int maxn = 0x3f3f3f3f;
ll dp[N];
ll c[N];
int main() {
    int n;
    cin>>n;
    ll i,a,b,z,j;
    for(i=0;i<n;i++)
    {
        scanf("%lld",&dp[i]);
    }
    for(i=0;i<n;i++)scanf("%lld",&c[i]);
    z=maxn;
    ll k;
    for(i=0;i<n;i++)
    {
        a=b=maxn;
        for(j=0;j<i;j++)
        {
            if(dp[i]>dp[j])a=min(a,c[j]);
        }
        for(k=i+1;k<n;k++)
        {
            if(dp[k]>dp[i])b=min(b,c[k]);
        }
        z=min(z,c[i]+a+b);
    }
    if(a==maxn)cout<<"-1"<<endl;
    else printf("%lld\n",z);
}

 

上一篇:20210114 - VJ 题解


下一篇:数据结构 图