这场打一半回宿舍有点事润了,态度不端正,下次改正
A. Anastasia and pebbles
题面
签到题,枚举每类石头即可,
w
a
wa
wa了一次因为判断错了,分两天取是
>
k
>k
>k,不是
≥
k
\ge k
≥k
#include<bits/stdc++.h>
#define N 200020
#define reg register
using namespace std;
typedef long long ll;
inline void read(int &x){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
x=s*w;
}
int n,k,a[N],ans,now;
int main(){
read(n),read(k);
for(int i=1;i<=n;i++)read(a[i]);
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
if(now==1)ans++,a[i]-=k,now=0;
if(a[i]>=2*k)ans+=a[i]/(2*k),a[i]%=(2*k);
if(a[i]>k)ans++,a[i]=0;
if(a[i]>0)now++;
}
if(now)ans++;
cout<<ans<<endl;
}
B. Masha and geometric depression
题面
把
a
a
a数组放进
s
e
t
set
set,循环枚举
b
b
b数组即可。判断是否无法找到直接利用循环次数即可,循环次数不会很大,因此判断循环次数即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll b1,q,l,m,ans,cnt;
set <ll> a;
inline void read(ll &x){
ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
x=s*w;
}
int main(){
read(b1),read(q),read(l),read(m);
for(int i=1;i<=m;i++){
ll x;read(x);
a.insert(x);
}
ll b2=b1;
while(abs(b2)<=l){
cnt++;
if(a.find(b2)==a.end())ans++;
b2*=q;
if(cnt>=100000){
if(ans!=0&&ans!=1)
ans=-1;
break;
}
}
if(ans==-1)printf("inf\n");
else printf("%lld\n",ans);
}
C. Functions again
题面
先预处理出差分数组的绝对值,不考虑
−
1
-1
−1的幂次,因为一加一减我们设
d
p
[
i
]
[
0
]
dp[i][0]
dp[i][0]为这一位是加法,
d
p
[
i
]
[
1
]
dp[i][1]
dp[i][1]为这一位是减法。
转移方程为
d
p
[
i
]
[
0
]
=
m
a
x
{
d
p
[
i
−
1
]
[
1
]
+
d
[
i
]
,
d
[
i
]
}
dp[i][0]=max\{dp[i-1][1]+d[i],d[i]\}
dp[i][0]=max{dp[i−1][1]+d[i],d[i]}
d
p
[
i
]
[
1
]
=
m
a
x
{
d
p
[
i
−
1
]
[
0
]
−
d
[
i
]
,
0
}
dp[i][1]=max\{dp[i-1][0]-d[i],0\}
dp[i][1]=max{dp[i−1][0]−d[i],0}
#include <bits/stdc++.h>
#define N 100010
using namespace std;
typedef long long ll;
inline void read(ll &x){
ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
x=s*w;
}
ll n,a[N],d[N],dp[N][2],ans;
int main(){
read(n);
for(ll i=1;i<=n;i++)read(a[i]);
for(ll i=1;i<=n;i++)d[i]=abs(a[i]-a[i+1]);
for(ll i=1;i<=n;i++){
dp[i][0]=max(dp[i-1][1]+d[i],d[i]);
dp[i][1]=max(dp[i-1][0]-d[i],0LL);
}
for(ll i=1;i<n;i++)ans=max(ans,max(dp[i][0],dp[i][1]));
cout<<ans<<endl;
}
A. Bear and Big Brother
题面
签到题
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
int main(){
cin>>n>>m;
while(n<=m){
n*=3,m*=2,cnt++;
}
cout<<cnt<<endl;
}
B. Bear and Friendship Condition
题面
利用并查集,每个并查集里的点和边应满足满射,即
m
=
n
(
n
−
1
)
/
2
m=n(n-1)/2
m=n(n−1)/2,做并查集并同时记录每个连通块中边的个数文章来源:https://www.toymoban.com/news/detail-585704.html
#include<bits/stdc++.h>
#define N 200020
#define reg register
using namespace std;
typedef long long ll;
inline void read(ll &x){
ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
x=s*w;
}
ll n,m,f[N],u,v,s[N],num[N],flag;
ll find(ll u){
if(u==f[u])return u;
else return f[u]=find(f[u]);
}
void merge(ll x, ll y){
x=find(x),y=find(y);
if(x==y)return ;
f[y]=x,num[x]+=num[y],num[y]=0;
}
int main(){
read(n),read(m);
for(ll i=1;i<=n;i++)f[i]=i,num[i]=1;
for(ll i=1;i<=m;i++)read(u),read(v),merge(u,v);
for(ll i=1;i<=n;i++){
if(num[i]>1)flag+=num[i]*(num[i]-1)/2;
}
if(flag!=m)puts("No");
else puts("Yes");
}
C. Bear and Different Names
题面
构造出一堆名字,每碰到一个
N
o
No
No就把当前区间的尾元素改为和首元素相同的名字,最后输出构造的名字即可。文章来源地址https://www.toymoban.com/news/detail-585704.html
#include <bits/stdc++.h>
#define N 200
using namespace std;
string s[N],s1;
int n,k;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)s[i]="Aa",s[i][0]+=i/26,s[i][1]+=i%26;
for(int i=1;i<=n-k+1;i++) {
cin>>s1;
if(s1[0]=='N')s[i+k-1]=s[i];
}
for(int i=1;i<=n;i++)cout<<s[i]<<' ';
printf("\n");
}
到了这里,关于TJUACM假期集训个人赛(八)(cf789a-c cf791a-c)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!