A - Contest for Robots CodeForces - 1321A
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[110];
int b[110];
int sum1=0;
int sum2=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
cin>>b[i];
if(a[i]==b[i])
continue;
else if(a[i]==1)
{
sum1++;
}
else if(b[i]==1)
{
sum2++;
}
}
if(sum1==sum2&&sum1==0)
{
cout<<"-1"<<endl;
}
else if(sum1>sum2)
cout<<"1"<<endl;
else if(sum1==sum2)
cout<<"2"<<endl;
else
{
int score=1;
int cha=sum2-sum1;
if(sum1!=0)
score+=cha/sum1+1;
else
score=-1;
cout<<score<<endl;
}
// system("pause");
return 0;
}
水题,唯一注意事项:当出现除法时,要考虑分母是否为0
B - Journey Planning CodeForces - 1321B
由于数据较大不可能穷举,而由题意可知当数与数间的距离为这两数之差时,这些数可以放到一起,所以同堆的数
-自身位置对应的下标一致。但减法后可能会是负下标,因此用map存。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
map <ll,ll> b;
int main()
{
ll a[200010] = {0};
int n;
cin >> n;
ll sum = 0;
ll c;
for (ll i = 1; i <= n; i++)
{
cin >> a[i];
if(b.count(a[i]-i))
b[a[i]-i]+=a[i];
else
{
b[a[i]-i]=a[i];
}
sum=max(sum,b[a[i]-i]);
}
cout << sum << endl;
//system("pause");
return 0;
}
启示:当进行运算时要考虑可能的错误:加乘超界,减法出现负数,除法分母为0.
C - Remove Adjacent CodeForces - 1321C
分析可知,每次应删除最大的字母,这样可以使删除量最大化。暴力求解即可,利用string的erase去除元素,
枚举从串中最大字母开始删起到a结束。注意:如bba,第一个b只遍历一遍的话无法删除,因此应当对同一个多次
枚举清除(枚举100次,因为串最长100)。
改自https://www.cnblogs.com/GRedComeT/p/12442873.html
#include<bits/stdc++.h>
using namespace std;
void solve() {
int n;
string str;
cin >> n >> str;
int ans = 0;
int maxx=0;
for(int i = 0; i < str.size(); ++i) {
maxx=max(maxx,str[i]-'a');
}
for(int k = maxx; k >= 0; --k) {
for(int t = 0; t < 100; ++t) {
for(int i = 0; i < str.size(); ++i) {
if((str[i] - 'a' == k) && ((str[i-1] - 'a' == k-1) || (str[i+1] - 'a' == k-1))) {
ans++;
str.erase(i, 1);
i--;
}
}
}
}
cout << ans;
}
int main() {
solve();
//system("pause");
return 0;
}