Codeforces Round #625 -前三题题解
文章目录
Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round)-A. Contest for Robots
打一场比赛做一个比赛和知识小结。
A. Contest for Robots
A. Contest for Robots
题意:很简单就不写了
思路:
- 第一个与第二个答题情况一样时都不选择情况为-1。
- 考虑第一个做对同时第二个做错的情况记录为x,第二个做对同时第一个做错的情况记录为y。
结果就是y/x+1;
为什么是y/x;对于每一个不够除+1,够除找最合适需要多一个也加1。
做题目时想法
关于这道题目细想:
- x==y && x!=0 maxx=2
- x>y maxx=1
- x==0 -1
- 否则 一个循环找
反思:
这个题目其实不需要用for枚举的,自己思路不够好
手速慢,细想花时间也有点多了。
代码1
#include <bits/stdc++.h>
#define pb(a) push_back(a)
#define pf push_front
#define beg begin
#define e end
#define rb rbegin0
#define re rend
#define nd cout<<endl
#define all(s) s.begin(),s.end()
#define pi acos(-1.0)
#define MaxN 0x3f3f3f3f
#define MinN 0xc0c0c0c0
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=2e5+15;
int n,a[N];
int c[N],b[N];
int main()
{
cin>>n;
int ans=0,cnt=0;
for(int i=0; i<n; i++)
{
cin>>a[i];
}
for(int j=0; j<n; j++)
{
cin>>b[j];
}
for(int i=0; i<n; i++)
{
if(b[i]==1&&a[i]!=1)
{
ans++;
}
else if(a[i]==1&&b[i]!=1)
{
cnt++;
}
}
if((ans==0&&cnt==0)||cnt==0)
cout<<"-1"<<endl;
else if(ans==cnt)
cout<<"2"<<endl;
else if(cnt>ans)
cout<<"1"<<endl;
else
{
int y=0;
int u=cnt;
for(int i=1;i<=1000;i++)
{
u=cnt*i;
if(u>ans)
{
y=i;
break;
}
}
cout<<y<<endl;
}
return 0;
}
代码2
#include <bits/stdc++.h>
#define pb(a) push_back(a)
#define pf push_front
#define beg begin
#define e end
#define rb rbegin0
#define re rend
#define nd cout<<endl
#define all(s) s.begin(),s.end()
#define pi acos(-1.0)
#define MaxN 0x3f3f3f3f
#define MinN 0xc0c0c0c0
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=2e5+15;
int n,a[105],b[105];
int main()
{
int x=0,y=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
{
if(a[i]&&!b[i])
x++;
if(!a[i]&&b[i])
y++;
}
printf("%d",x?y/x+1:-1);
return 0;
}
B. Journey Planning
Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round)-B. Journey Planning
题意:
思路:
代码1
#include <bits/stdc++.h>
#define pb(a) push_back(a)
#define pf push_front
#define beg begin
#define e end
#define rb rbegin0
#define re rend
#define nd cout<<endl
#define all(s) s.begin(),s.end()
#define pi acos(-1.0)
#define MaxN 0x3f3f3f3f
#define MinN 0xc0c0c0c0
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=2e5+15;
int n;
long long f[1000000]= {
0};
int b[200002];
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&b[i]);
if(b[i]-i+400000>=0)
f[b[i]-i+400000]+=b[i];
}
ll ans=-1;
for(int i=0; i<1000000; i++)
{
if(ans<f[i])
ans=f[i];
// if(i<100)printf("%d\n",f[i]);
}
printf("%lld",ans);
return 0;
}
代码2
#include <bits/stdc++.h>
#define pb(a) push_back(a)
#define pf push_front
#define beg begin
#define e end
#define rb rbegin0
#define re rend
#define nd cout<<endl
#define all(s) s.begin(),s.end()
#define pi acos(-1.0)
#define MaxN 0x3f3f3f3f
#define MinN 0xc0c0c0c0
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=2e5+15;
int main()
{
map <int, long long> M;
int n, x;
long long ans = 0LL;
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> x, M[i - x] += (long long)x, ans = max(ans, M[i - x]);
cout << ans;
return 0;
}
C. Remove Adjacent
Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round)-C. Remove Adjacent
题意:
小写字母构成的字符串s,让你去不断的删除字母,删除的规则是:将当前字母s[i] 前一个或者后一个 与当前的差为1,则删除当前这个。最后要求你删除字母的操作必须是最大。
思路:
按照题意删除,要想最大,那么我们就需要从字符串中字母字典序最大的开始考虑删除。
关于这道题目:
当时的思考是如思路所写,然后想怎么实现的时候,在想这个每次找一下最大,时间复杂度允许,但写起来不是最好,于是,再考虑一些字母的性质,最大的为’z‘ 那么我们倒过来当前的最大的‘z’,然后判断s[i] 是否与之相等。相等判断是否删除当前的s[i]
反思:
一开始想的时候并没有用string考虑 导致自己花了一些时间去想怎么删除后重构字符串。
所以关于string 今天早上打算细学深思。
代码:
#include <bits/stdc++.h>
#define pb(a) push_back(a)
#define pf push_front
#define beg begin
#define e end
#define rb rbegin0
#define re rend
#define nd cout<<endl
#define all(s) s.begin(),s.end()
#define pi acos(-1.0)
#define MaxN 0x3f3f3f3f
#define MinN 0xc0c0c0c0
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=2e5+15;
string s;
int n;
int main()
{
cin>>n>>s;
int ans = 0;
for(char C = 'z'; C > 'a'; C--)
for(int i = 0; i <s.size(); i++)
{
if(s[i] != C)
continue;
if((s[i - 1] + 1 == s[i] && i != 0) || s[i + 1] + 1 == s[i] && i != s.size() - 1)
{
s.erase(s.begin() + i);
i = -1;
ans += 1;
}
}
cout<<ans<<endl;
return 0;
}
String知识的回顾和加深:
一点都不会的可以去看看这篇博客
或者新写的一篇博客
s.size()
返回s 中字符的字符个数
s.erase( p )
删除迭代器p指向的元素,返回一个迭代器,指向被删除元素后面的元素
也就是删除p这个位置的元素,然后后面的元素往前移一位。
String 的遍历
string s;
string::iterator it;//迭代器
for(it=s.begin();it!=s.end();++it)
代码
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main()
{
string s("wow wow");
string::iterator it;
for(it=s.begin();it!=s.end();++it)
cout<<*it<<endl;
for(int i=0;s[i];i++)
cout<<s[i]<<endl;
cout<<s<<endl;
return 0;
}