A、Prime Subtraction
水题,只要两个数相差不为1即可。
B、Kill 'Em All
题意:在坐标轴上有n个怪物,都在坐标轴正方向,一旦这些怪物到达0点或者坐标轴负方向,则怪物会被杀死。现在你可以对任意位置发射炮弹,如果炸到怪物,则怪物死亡,位于炮弹左边的怪物向左移动距离r,右边的怪物向右移动距离r,问多最少多少炮弹把所有怪物杀死。
思路:首先想的是贪心,让炮弹炸死最远的怪物,其他的怪物向原点方向移动距离r,然后判断即可。
思维题,其实有思路之后就很好解决了。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
int a[N],b[N],pd[N];
int main()
{
int t;
int n,r,x;
cin >> t;
while(t--)
{
cin >> n >> r;
for(int i=0;i<n;i++)
cin >> a[i];
sort(a,a+n);
int ans=1,sum=r;
for(int i=n-2;i>=0;i--)
{
if(a[i]==a[i+1])
continue;
if(a[i]>sum)
{
ans++;
sum+=r;
}else
break;
}
cout << ans <<endl;
}
return 0;
}
C、Standard Free2play
题意:人在高为h处平台上,要下到地面,如果在高为x的平台上按下开关,那么x处平台将会缩回去,x-1处的平台改变状态(缩进去的弹出来,弹出来的缩进去),如果人从x处平台直接掉落到x-3处或者更高,那么小人将会摔死,这时候就需要一块钱来改变一个平台来接住小人。问最少需要多少钱才能安全到达地面。
思路:模拟路径即可,具体思路看代码有注释。
这道题之前好像做过,但是还是花了好长时间来思考这道题目应该怎么模拟实现。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
ll a[N],b[N],pd[N];
int main()
{
int t;
ll h,n;
cin >> t;
while(t--)
{
cin >> h >> n;
for(int i=0; i<n; i++)
cin >> a[i];
a[n]=0;
int ans=0;
for(int i=1; i<n; i++)
{
//此时站在i-1的位置
//如果i-1的高度与i的高度相差大于1,那么可以达到a[i]+1的位置
//如果相差等于一,依旧是在a[i]+1的位置
//所以说看a[i+1]和a[i]是否相差1,如果相差1的话可以从a[i]+1落到a[i+1]这个台子上
//如果相差大于1,就会摔死,所以要氪金
if(a[i+1]+1==a[i])
i++;
else
ans++;
}
cout << ans <<endl;
}
return 0;
}
D、AB-string
题意:给你一个由AB组成的字符串,找出好串的个数。好串是字符串的每个字母至少属于一个长度大于1的回文的串。
思路:因为s的子串中好串的数量是要大于非好串的数量的,所以我们是不是可以只找出s中所有的非好串的子串,最后用总的子串减去非好串的子串。且可以看出,非好串即单个A带着多个B或单个B带多个A的情况。
想了半天没想出来怎么解,然后现在看题目看错了,关于好串的意思理解错了,然后跑偏了没想出来怎么个解法。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
ll c[N],b[N],pd[N];
vector<ll> a;
int main()
{
ll n;
string s;
cin >> n >> s;
for(ll i=0;i<n;i++)
{
char c = s[i];
ll cnt = 1;
while(s[i+1]==c)
{
i++;
cnt++;
}
a.push_back(cnt);
}
ll ans = n*(n-1)/2; //s的所有子串数
for(int i=1;i<a.size();i++)
ans -= (a[i-1]+a[i]-1);
cout << ans <<endl;
return 0;
}
E、F题难题和数据结构的题目,还没得整理。