一万年没写博客了,来更新一场cf
题目链接
A - Strange Functions
签到题输出字符串长度就好了
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
char s[maxn];
void solve(){
scanf("%s",s+1);
int len=strlen(s+1);
printf("%d\n",len);
}
int main(){
int T;scanf("%d",&T);while(T--)
solve();
return 0;
}
B - Jumps
首先我们找到经过
i
i
i步向右跳能够超过
x
x
x,容易看出超过部分一定严格小于
i
i
i,我们计算出超出部分为
y
y
y,如果说
y
>
=
2
y>=2
y>=2,我们只需要将第前面的
y
−
1
y-1
y−1步改为向后跳,如果
y
=
1
y=1
y=1,我们则需要再额外跳一步。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
char s[maxn];
int sum[2005];
void solve(){
int x;
scanf("%d",&x);
int now;
for(int i=1;i<=2000;i++){
if(sum[i]==x){
printf("%d\n",i);
return ;
}
if(sum[i]>x&&sum[i]-x!=1){
printf("%d\n",i);
return ;
}
if(sum[i]>x){
now=i;
break;
}
}
printf("%d\n",now+1);
}
void init(){
for(int i=1;i<=2000;i++){
sum[i]=sum[i-1]+i;
}
}
int main(){
init();
int T;scanf("%d",&T);while(T--)
solve();
return 0;
}
C - Ping-pong
以自己胜利的局数为优先,因此Bob可以采取前面的球都不接,直到Alice只剩最后一点体力了才开始接球的策略。最终答案就是x-1:y。
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int T;scanf("%d",&T);while(T--)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d %d\n",x-1,y);
}
return 0;
}
D - Sequence and Swaps
我们考虑贪心,遇到当前
a
i
a_i
ai满足交换条件时且
x
<
=
a
i
+
1
x<=a_{i+1}
x<=ai+1,我们就进行一次交换,并且在每一次交换之后都进行一次判断是否已经满足非递减序列。
代码
#include <bits/stdc++.h>
using namespace std;
int a[505];
int n,x;
bool ck(){
for(int i=2;i<=n;i++){
if(a[i]<a[i-1])
return false;
}
return true;
}
void solve(){
scanf("%d%d",&n,&x);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
a[n+1]=1e9;
int cnt=0;
if(ck()){
printf("%d\n",cnt);
return ;
}
for(int i=1;i<=n;i++){
if(a[i]>x){
if(x<=a[i+1]){
cnt++;
swap(a[i],x);
if(ck()){
printf("%d\n",cnt);
return ;
}
}
else {
puts("-1");
return ;
}
}
}
puts("-1");
}
int main(){
int T;scanf("%d",&T);while(T--)
solve();
return 0;
}
E - Four Points
我们需要对四个点进行两两组合,并且要横纵坐标分开来看,举个例子横坐标{1,2}、{3,4},纵坐标{1,3}、{2,4}。在同一组的对应的坐标值要相等,到这步可以贪心求,但这只是长方形,要变成正方形还需要算出横纵坐标形成边长的区间,如果这两个区间不相交再加上相差的两倍就是答案。
由于分组种类比较多,我写了个300行的分类讨论,代码就不贴了。