牛客寒假基础训练5
牛客寒假基础训练5
A:模板
签到题,但是我竟然WA了一次真的十分的伤心,一开始算的字符串中不同的字符个数再加上字符串长度差值,交上去就WA了,后来改成了用最长字符串的长度减去从头开始遍历是字母相同的个数,就AC了,其中原因至今不明。。。。。让我再仔细研究研究
/*************************************************
* @Author: maple
* @Date: 2020-02-13 13:01:48
* @Last Modified by: maple
* @Last Modified time: 2020-02-13 13:20:35
* @Mark
*************************************************/
#include <bits/stdc++.h>
#define CSE(x,y) memset(x,y,sizeof(x))
#define lowbit(x) x&(-x)
#define Abs(x) x>=0?x:(-x)
#define FAST ios::sync_with_stdio(false);cin.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int maxn=11111;
int n,m;
string a,b;
int main()
{
FAST;
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
cin>>n>>m;
cin>>a>>b;
int ans=max(n,m);
for(int i=0;i<min(n,m);i++){
if(a[i]==b[i])
ans--;
}
cout<<ans<<endl;
return 0;
}
贴个代码意思一下
B:牛牛战队的比赛地
一道简单的三分题(题解说二分也可以做但是相当麻烦,也就没有再去深究)。其实当时能想到三分是受了一定的提醒的,因为在题目说明里说到了会考察三分,而且我之前好像还恰好做过一道类似的三分题目,自然就想到了,这题最难应该是想到最大值关于 x 座标的函数是二次函数,想明白是二次函数后用三分就很简单了。也是好久没有写三分的题,一开始写的三分 l , r 更新那里写错了,就WA了一次,还好算法书摆在手边上,及时查了查,得以挽救。不然估计就升天了。。。。。
/*************************************************
* @Author: maple
* @Date: 2020-02-13 16:38:10
* @Last Modified by: maple
* @Last Modified time: 2020-02-13 17:38:13
* @Mark
*************************************************/
#include <bits/stdc++.h>
#define CSE(x,y) memset(x,y,sizeof(x))
#define lowbit(x) x&(-x)
#define Abs(x) x>=0?x:(-x)
#define FAST ios::sync_with_stdio(false);cin.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int maxn=111111;
int n;
double x[maxn],y[maxn];
double get_max(double ad){
double ans=0;
for(int i=0;i<n;i++){
ans=max(ans,(ad-x[i])*(ad-x[i])+y[i]);
}
return ans;
}
bool chack(double l,double r){
return get_max(l)<get_max(r);
}
int main()
{
FAST;
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
while(cin>>n){
for(int i=0;i<n;i++){
cin>>x[i]>>y[i];
y[i]*=y[i];
}
double l=-20000,r=20000;
while(r-l>=1e-4){
double m1=l+(r-l)/3.0;
double m2=r-(r-l)/3.0;
if(chack(m1,m2)){
r=m2;
}
else{
l=m1;
}
}
cout<<sqrt(get_max(l))<<endl;
}
return 0;
}
三分还是一定要记住的
C:C语言IDE
一道让人看了就不想写的模拟题,虽然题解说不大不小。。。。。但是代码量是真的多,这题就先这样吧,本人很懒不想写
//此处省略n行代码
D:牛牛与牛妹的约会
一看就是贪心题,这题很明显,思路也不难想,但是我写出代码愣是没对,因为是最后才开始写这道题,所以就死的很惨,到最后也没有调出来,代码中有一个问题:
/*************************************************
* @Author: maple
* @Date: 2020-02-13 17:44:40
* @Last Modified by: maple
* @Last Modified time: 2020-02-13 18:17:45
* @Mark
*************************************************/
#include <bits/stdc++.h>
#define CSE(x,y) memset(x,y,sizeof(x))
#define lowbit(x) x&(-x)
#define Abs(x) x>=0?x:(-x)
#define FAST ios::sync_with_stdio(false);cin.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int maxn=11111;
int main()
{
//FAST;
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
int t;
cin>>t;
while(t--){
double a,b;
scanf("%lf%lf",&a,&b);
double tm=0;
while(1){
double ch;
if(a<0) ch=-pow(-a,1.0/3);
else ch=pow(a,1.0/3);
//ch=pow(a,1.0/3);
if(abs(ch-b)+1.0<abs(a-b)){
a=ch;
tm+=1;
}
else{
tm+=abs(a-b);
break;
}
}
printf("%.9f\n",tm);
}
return 0;
}
///////如果while内写成如下//////
/*
ch=pow(a,1.0/3);
if(abs(a-ch)>1){
a=ch;
tm+=1;
}
else{
tm+=abs(a-b);
break;
}
这样就不对了//
最近写题思路都能想到,但是老是在代码上出问题,我得反思一下了。。。。
E:Enjoy the game
一道典型的博弈论的题目,说是博弈论其实就是找规律,这题做的我真的是十分的艰难,一开始我列出1——14的结果但是尴尬的是我把12算错了,导致我把规律找成了2的偶数倍WA了很多次。
/*************************************************
* @Author: maple
* @Date: 2020-02-13 13:54:58
* @Last Modified by: maple
* @Last Modified time: 2020-02-13 16:20:13
* @Mark
*************************************************/
#include <bits/stdc++.h>
#define CSE(x,y) memset(x,y,sizeof(x))
#define lowbit(x) x&(-x)
#define Abs(x) x>=0?x:(-x)
#define FAST ios::sync_with_stdio(false);cin.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int maxn=11111;
bool ok_(ll n){
while(n>1){
if(n%2==1)
return true;
n/=2;
}
return false;
}
int main()
{
FAST;
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
ll n;
cin>>n;
ok_(n)?cout<<"Bob"<<endl:cout<<"Alice"<<endl;
return 0;
}
代码没什么可说的
F:碎碎念
G:街机争霸
H:Hash
根据给出的hash函数很容易想到进制转换,hash函数只是把一个六位字符串转当作26进制数转换成了十进制后的取模的结果,所以我们求出原字符串的十进制数值之后加上一个mod就是大于原字符串而且同余的字符串,在这个过程中注意判断加上mod后是否超过了六位字符串所能表达的最大值,如果超过输出“-1”即可
/*************************************************
* @Author: maple
* @Date: 2020-02-13 16:29:26
* @Last Modified by: maple
* @Last Modified time: 2020-02-13 16:44:10
* @Mark
*************************************************/
#include <bits/stdc++.h>
#define CSE(x,y) memset(x,y,sizeof(x))
#define lowbit(x) x&(-x)
#define Abs(x) x>=0?x:(-x)
#define FAST ios::sync_with_stdio(false);cin.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const ll maxn=308915775;
string str;
ll mod;
ll get_BB(){
ll ans=0;
for(auto &k:str){
ans=ans*26+1ll*int(k-'a');
}
return ans;
}
string get_ans(ll x){
stack<ll>box;
while(x){
box.push(x%26);
x/=26;
}
while(box.size()<6)
box.push(0);
string ans;
while(!box.empty()){
ans+=char(box.top()+'a');
box.pop();
}
return ans;
}
int main()
{
FAST;
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
while(cin>>str>>mod){
ll mid=get_BB()+mod;
//cout<<mid<<endl;
if(mid>maxn)
cout<<"-1"<<endl;
else{
cout<<get_ans(mid)<<endl;
}
}
return 0;
}
I:I题是个签到题
真。签到题,不过自我感觉这个题出的是真的恶心,一开始没看这题是,广播就说这个题应该考虑重复,然后它越描越黑,导致后来我看了之后考虑了很久去重。题本身不难,直接对输入的过题人数从大到小排序之后看看I题过题人数是否超过或者等于第三个的成绩就可以了
/*************************************************
* @Author: maple
* @Date: 2020-02-13 13:23:01
* @Last Modified by: maple
* @Last Modified time: 2020-02-13 13:41:07
* @Mark
*************************************************/
#include <bits/stdc++.h>
#define CSE(x,y) memset(x,y,sizeof(x))
#define lowbit(x) x&(-x)
#define Abs(x) x>=0?x:(-x)
#define FAST ios::sync_with_stdio(false);cin.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int maxn=1111;
int n,m,arr[maxn],I;
int main()
{
FAST;
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>arr[i];
}
I=arr[8];
sort(arr,arr+n,greater<int>());
if(arr[2]<=I||I>=m*0.8){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
return 0;
}
J:牛牛战队的秀场
这个题被它题目描述的精度控制给带偏,我以为要用更高精度的算法计算sin
,特地还去查了查,结果最后得知只要用double和内置的sin
就能过
说道用更高精度的计算方法计算sin
,就展开说一下,在学高数的时候我们学过关于sin
的泰勒展开式形式,借助泰勒展开式我们就可以计算出更加精确的sin
值,这个东西具体能不能比内置sin
的精度更高我就不太清楚了,不过感觉记住总没坏处
在n足够大的时候精度就会很高,n大到42时精确度已经到10的负一百多次方了
/*************************************************
* @Author: maple
* @Date: 2020-02-13 14:56:36
* @Last Modified by: maple
* @Last Modified time: 2020-02-13 16:12:48
* @Mark
*************************************************/
#include <bits/stdc++.h>
#define CSE(x,y) memset(x,y,sizeof(x))
#define lowbit(x) x&(-x)
#define Abs(x) x>=0?x:(-x)
#define FAST ios::sync_with_stdio(false);cin.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int maxn=42;
const double PI = 3.1415926535;
int n,r,i,j;
double get_step(int x){
double ans=1.0;
for(int i=2;i<=x;i++){
ans*=i;
}
return ans;
}
double Sin(double x){
double ans=0;
for(int i=0;i<maxn;i++){
if(i&1)
ans-=pow(x,i*2+1)/get_step(i*2+1);
else
ans+=pow(x,i*2+1)/get_step(i*2+1);
}
return ans;
}
double get_edge(){
return 2.0*r*sin(PI/n);
}
int get_mindis(){
return min(abs(i-j),n-abs(i-j));
}
int main()
{
//FAST;
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
cin>>n>>r;
cin>>i>>j;
printf("%.6f\n",get_mindis()*get_edge());
return 0;
}