首页 > 其他分享 >CF-957(D-E)

CF-957(D-E)

时间:2024-07-14 13:19:04浏览次数:7  
标签:10 cnt int res CF 957 else now

CF-957

赛时A去写全排列……前三题我的写法都挺丑的,后面改进了再更……

Problem - D - Codeforces

虽然是很简单很经典的线性dp,但也是我第一次自己把这种题写出来ヾ(≧▽≦*)o

分析

看题面很容易想到线性递推来更新状态,是一种线性dp。

  • f[i]>=0表示第i个点能被达到,否则不能被达到,因为最多在水中游k米,这一条件会影响是否能达到该点,所以我们用f[i]>=0时的值来表示这一状态,即在第i点最多还能游f[i]米

  • 初始条件:f[0]显然为k,而1~m内的点都在第一次跳跃的范围内,其中s[i]为C情况不能达到,设f[i]=-1,其余点就是f[i]=k,由此m+1~n+1的点都可以通过状态转移递推得到

  • 状态转移:对于在m+1~n+1范围内的点i,如果s[i]为C,显然无法达到,f[i]=-1,而s[i]为W或者L时,点i的状态可以由[i-m,i-1]的点j更新,s[j]=L或者j为0时意味着可以由点j跳到点i,而s[j]为W的情况则只能在j为i-1时更新,表示从i-1游到i,此时要用f[i-1]-1来更新f[i]

最后若判断f[n+1]>=0与否即可

代码

const int N=2e5+5;
int f[N];
void solve() {
	int n,m,k;cin>>n>>m>>k;
	string s;cin>>s;
	s=' '+s;
	rep(i,0,n+1) f[i]=-1;
	rep(i,0,m){
		if(s[i]!='C'||i==0) f[i]=k;
		else f[i]=-1;
	}
	rep(i,m+1,n+1){
		if(s[i]!='C'||i==n+1){
			rep(j,i-m,i-1){
				if(s[j]=='L'||j==0) f[i]=max(f[i],f[j]);
				else if(j==i-1&&s[j]=='W') f[i]=max(f[i],f[j]-1);
			}
		}
		else f[i]=-1;
	}
	if(f[n+1]>=0) cout<<"YES";
	else cout<<"NO";
	cout<<endl;
}

Problem - E - Codeforces

暴力枚举

分析

注意到a的范围只有1e4,n为一、二、三位数时,n*a最多1e4、1e5、1e6,也就是说,n为一,二,三位数的情况下,a-b分别<=4,5,6,如此我们可以在考虑n的位数的情况下暴力枚举a、b的值求解

代码

int n,_=1e4;
bool f(int w,int a,int b){
	int res=0,cnt=0;
	if(w==1){
		cnt=a-b;
		while(cnt--){
			res=res*10+n;
		}		
	}
	else if(w==2){
		cnt=a*2-b;
		int now=1;
		while(cnt--){
			if(now) res=res*10+n/10;
			else res=res*10+n%10;
			now^=1;
		}
	}
	else{//因为按数据范围,这种情况只有n=100
		cnt=a*3-b;
		int now=0;
		while(cnt--){
			if(!now) res=res*10+1;
			else res=res*10;
			now=(now+1)%3;
		}
	}
	return res==n*a-b;
}
void solve() {
	cin>>n;
	vector<pair<int,int>>ans;
	if(n<10){
		rep(i,1,_){
            int s=max(i-4,1ll);
			rep(j,s,i-1){
				if(f(1,i,j)) ans.push_back({i,j});
			}
		}
	}
	else if(n<100){
		rep(i,1,_){
			int s=max(i*2-5,1ll);
			rep(j,s,i*2-1){
				if(f(2,i,j)) ans.push_back({i,j});
			}
		}
	} 
	else{
		rep(i,1,_){
			int s=max(i*3-6,1ll);
			rep(j,s,i*3-1){
				if(f(3,i,j)) ans.push_back({i,j});
			}
		}
	}
	cout<<ans.size()<<endl;
	for(auto [a,b]:ans) cout<<a<<" "<<b<<" "<<endl;
}

标签:10,cnt,int,res,CF,957,else,now
From: https://www.cnblogs.com/mono-4/p/18301379

相关文章

  • 题解:Codeforces CF1613C Poisoned Dagger
    标签:二分题意给定一个长度为\(n\)的序列\(a\),定义数\(k\),对于\(i>1\),如果\(a_i-a_{i-1}<k\),\(s\)加上\(a_i-a_{i-1}\),否则加上\(k\),求满足\(s\geqh\)的最小\(k\)。思路手玩样例,\(k\)越大龙死的越快,所以具有单调性,考虑二分答案。每次缩小范围时判断是否\(k\g......
  • CodeForces Round 957 (Div3)
    蒟蒻找了一些简单题做了而已,别太在意……比赛链接CodeForcesRound957(Div3)A.OnlyPluses题意三个正整数\(a,b,c\),有五次操作机会。每次操作:选取\(a,b,c\)中任意一个数,将这个数加上一。要求最大化\(a\timesb\timesc\)。思路很直接的贪心题。假设有三个正整......
  • CF1983E I Love Balls
    Problem-E-Codeforces爱丽丝和鲍勃玩摸球游戏。有\(n\)个球,其中\(k\)个是特殊球。每个球都有其价值。他们轮流且不放回地摸球,每回合随机摸一个球并获得该球的价值。特别地,如果摸到了特殊球(且至少还有一个球)则这名玩家继续摸球。如果摸到的是普通球,则换人摸球。这样轮流......
  • 2024年06月CCF-GESP编程能力等级认证C++编程三级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有()种。A.1B.2C.3D.4答案:C第2......
  • Codeforces Round 957 (Div. 3) A-G 题解
    CodeforcesRound957(Div.3)A-G题解A.OnlyPluses枚举思路:枚举\(a\),\(b\),\(c\)增加的次数,维护最值即可。代码:#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#......
  • CF1114F Please, another Queries on Array?
    一道很好的线段树+求欧拉函数题!!!先简单理解一下题意:给你一段长度为n的区间,q次操作,输入为1时将l~r区间每个数乘上x,输入为2时求解\(\varphi(\prod_{i=l}^{r}{a_i})\)。赛时心历经过:第一眼感觉是个线段树板子题,赛时也是这么想的,打到一半发现不对劲,首先这个乘积就没法维护,随便乘......
  • [题解] CF19D Points
    [题解]CF19DPointsCF19DPoints在一个笛卡尔坐标系中,定义三种操作:addxy:在坐标系上标记一个点\((x,y)\),保证\((x,y)\)在添加前不在坐标系上。removexy:移除点\((x,y)\),保证\((x,y)\)在移除前已在坐标系上。findxy:找到所有已标记的\((x',y')\),需满......
  • Codeforces Round 957 (Div. 3)
    E-Novice'sMistake题意为寻找n*a-b=("n"+"n"+...){a个n的字符串-b的长度}即为"2"⋅20−18="22222222222222222222"−18=22=2⋅20−18使用暴力枚举每个n相加的长度和又因为n<=100a<=100000所有答案t的值必定小于1e6所以对每个a进行枚举对于每个答案t进行判断是否成立其......
  • 【CF1656H】Equal LCM Subsets
    【CF1656H】EqualLCMSubsets题意给定集合\(A\)和\(B\),从中选择两个子集\(A'\subseteqA,B'\subseteqB\)满足\(\operatorname{lcm}(A')=\operatorname{lcm}(B')\)。满足\(\lvertA\rvert,\lvertB\rvert\le10^3,A,B\le4\times10^{35}\)。......
  • [CF1656G] Cycle Palindrome 的题解
    题目大意给定一个长度为\(n\)的数列\(a\),要求求出一个排列\(p\)满足\(a_{p_1},a_{p_2},\cdots,a_{p_n}\)是一个回文字符串而且把\(i\)向\(p_i\)连边得到的图中只有一个环。数据范围满足,\(1\le\sumn\le2\times10^5\)。思路先不考虑\(p\)是否构成满足要求的环......