比赛链接:https://codeforces.ml/contest/1321
A:Contest for Robots
题意:
共有n场比赛,A,B两人参赛,0表示本场比赛不得分,1表示得分。给出AB两人的比赛情况,请你制定每场比赛的得分(最低为1分),使得A的最终分数比B多且尽可能使两人分数相差不大,如果可以,输出得分最高的那场比赛,如果无论怎样指定得分A都不会比B多输出-1;
思路:如果某场比赛AB都得分了,那么两人分数一定相同,关键在于两人多得到的分数,所以
用num表示A赢得比赛但B没赢的场数,用sum表示B赢的比赛但A没赢的场数。
如果num = 0 说明 a 没有额外赢得比赛,无论分数怎么指定,B的分数一定大于等于A的分数 输出-1
如果num > sum 说明就算每场比赛都是1分,A的总分也比B高,输出1
但 num < sum 时,为了使得输出尽可能小,就只能让B多赢的比赛为1分,只要a某场比赛得分比 sum/num 大就行(注意不能整除的情况)
#include
using namespace std;
int main()
{
int n,a[1000],b[1000],sum=0,num=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
cin>>b[i];
if(b[i]>a[i])sum++;
else if(b[i]
题意:给定一个下标为1到n 的数组b,请你在1到n中选一个递增数列c使得对应b数组的值的和最大,且满足①c[i+1] - c[i] = b[ c[i+1] ] - b[ c[i] ]
思路:直接把下标为i+1的两项移动到一起,就发现只要是数组中当前的下标和当前下标对应的值的差值相等就行。然后记录下相同差值的分别求和中最大是多少就行。
#include
using namespace std;
typedef long long ll;
const int maxn = 2e5+5;
map s;
int main()
{
int n;
cin>>n;
ll b[maxn];
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
ll ans = 0;
for(int i=1;i<=n;i++)
{
s[b[i]-i]+=b[i];
ans = max(ans,s[b[i]-i]);
}
cout<
题意:给定一串字母,你可以删除某个元素i 规则是,i-1或者i+1的位置上的字母是i字母的上一个字母,删除后原来两段在合并成一段即i-1与i+1相邻了,请输出最多可以删除几个元素
思路:i周围有i上一个字母则可以删,如果从z开始删除则不会影响前面的字母,由于数据范围较小100,直接模拟就行,从字典序列大的开始删除 注意!正向遍历一遍后 在反向遍历一次。
#include
using namespace std;
typedef long long ll;
//typedef pair PAIR;
const int maxn = 2e5+5;
int vis[30]={0};
int main()
{
int n;
cin>>n;
string s;
cin>>s;
for(int i=0;i=0;j--)
{
if(vis[j]==0) continue;
for(int i=0;i=0)||(s[i+1]-'a'==j-1&&i+1<=s.length()))
{
s.erase(i,1);
i--;//删除后i+1变为了i,而此时表示的是i+1
ans++;
}
}
}
//反向
for(int i=s.length()-1;i>=0;i--)
{
if(s[i]-'a'==j)
{
if((s[i-1]-'a'==j-1&&i-1>=0)||(s[i+1]-'a'==j-1&&i+1<=s.length()))
{
s.erase(i,1);
i++;
ans++;
}
}
}
}
cout<