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; }
题意:计算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; }
题意:
现在是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); }