TJUACM假期集训个人赛(八)(cf789a-c cf791a-c)

这场打一半回宿舍有点事润了,态度不端正,下次改正

A. Anastasia and pebbles

题面

签到题,枚举每类石头即可, w a wa wa了一次因为判断错了,分两天取是 > k >k >k,不是 ≥ k \ge k ≥k

cpp 复制代码
#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数组即可。判断是否无法找到直接利用循环次数即可,循环次数不会很大,因此判断循环次数即可。

cpp 复制代码
#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}

cpp 复制代码
#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

题面

签到题

cpp 复制代码
#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,做并查集并同时记录每个连通块中边的个数

cpp 复制代码
#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就把当前区间的尾元素改为和首元素相同的名字,最后输出构造的名字即可。

cpp 复制代码
#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");
}
相关推荐
.Vcoistnt20 分钟前
Codeforces Round 994 (Div. 2)(A-D)
数据结构·c++·算法·贪心算法·动态规划
摇光9334 分钟前
js高阶-async与事件循环
开发语言·javascript·事件循环·宏任务·微任务
沐泽Mu38 分钟前
嵌入式学习-QT-Day09
开发语言·qt·学习
小猿_0043 分钟前
C语言实现顺序表详解
c语言·开发语言
ALISHENGYA1 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战训练三)
数据结构·c++·算法·图论
余~~185381628001 小时前
NFC 碰一碰发视频源码搭建技术详解,支持OEM
开发语言·人工智能·python·音视频
GOATLong1 小时前
c++智能指针
开发语言·c++
Dola_Pan1 小时前
C语言:随机读写文件、实现文件复制功能
c语言·开发语言
佳心饼干-2 小时前
C语言-08复合类型-结构体
c语言·开发语言