首页 > 其他分享 >Educational Codeforces Round 164 (Rated for Div. 2)

Educational Codeforces Round 164 (Rated for Div. 2)

时间:2024-04-25 09:55:22浏览次数:21  
标签:字符 Educational Rated 颜色 int Codeforces cin bob dp

A. Painting the Ribbon
题意:n个物体,m个颜色,alice要给每个物体任意涂一个颜色。bob可以给k个物体涂色 ,问alice能否阻止bob让所有的物体颜色都相同。

思路:思维题。如果m=1,那么无解。如果m > 1,那么bob如果想要染成同一个颜色,alice可以让bob需要染色的数量最多。如果染色的数量最多,那么m个颜色都要用上,其中颜色最多的part一定是(n - m + 1) / m,这个颜色也就是bob的目标色。 那么bob要染色的数量就是n - (n - m + 1) / m,如果k >= 这个数,那么alice就失败,否则成功。

总结:太久没写cf的题了,想了好久。cf果然是锻炼思维的绝境之地。

void solve(){
	int n, m, k;
	cin >> n >> m >> k;

	if (k >= n - (n + m - 1) / m){
		cout << "NO\n";
	}
	else{
		cout << "YES\n";
	}
}

B. Make It Ugly

题意:一个数组是beautiful的,如果他能够通过这个操作将数组所有的数字变成相同的。 if (a[i - 1] == a[i + 1]) a[i] = a[i - 1];
问:最少删除多少个数字,可以让这个数组不是beautiful的。

思路:依然是思维题,很容易想到如果首末不相等或者所有元素都相等,那么不需要操作。而且需要操作的元素一定跟首元素不相等,我们的目的是让需要操作的元素作为最后一个元素出现,或者让两个需要操作的元素相邻起来(统计两个需要操作元素的中间有多少个元素)。

总结:思维被拷打,最后还没写出来,难题啊,这个代码的思路真的厉害,不仅处理了多个需要修改数值的情况,也考虑删除第一个前面所有字符,删除最后一个后面所有字符,以及全部字符都相等的情况。

void solve(){
    int n;
    cin >> n;

    vector<int> a(n);
    for (auto& x : a){
        cin >> x;
    }

    int ans = n;
    int last = -1;
    for (int i = 0; i <= n; ++i){
        if (i == n || a[i] != a[0]){
            ans = min(ans, i - last - 1);
            last = i;
        }
    }

    if (ans == n){
        ans = -1;
    }
    cout << ans << '\n';
}

C. Long Multiplication

题意:给定2个长度相等的字符串,可以交换字符串中相同位置的字符,求两个字符串相乘值最小时分别是多少。

思路:看输入输出,发现第一个不相等的字符后面,小的都往第一个字符大的串里放,其他的往第一个字符小的串里放。

总结:套路题,研究原理的话要研究一阵子呢,找规律就行。

void solve(){
	string s, t;
	cin >> s >> t;

	int n = int(s.size());

	bool firstTime = true;
	for (int i = 0; i < n; ++i){
		if (s[i] != t[i]){
			if (firstTime){
				if (s[i] < t[i]){
					swap(s[i], t[i]);
				}
				firstTime = false;
			}
			else{
				if (s[i] > t[i]){
					swap(s[i], t[i]);
				}
			}
		}
	}

	cout << s << "\n" << t << '\n';
}

D. Colored Balls

题意:n个颜色的球,每个颜色球的数量给出。定义value为当前若干个颜色球中最小的group数,group最多包含两个球,并且两个球颜色不能相同。
问2 ^ n种球的组合中,value一共是多少。

思路:首先,对于一个单独的组合,如果该组合中的最大值<=其他值的和,那么value就是该组合的(sum + 1) / 2,否则,value就是最大值。也就是说,对于每个组合,value的最小值是(sum + 1) / 2。基于这个思想,先用背包求出所有组合的sum的方案数,可以求出一个ans值。然后,要把剩下的一部分加进去,剩下的这部分怎么求呢?对于每个颜色,如果有某种组合的存在,那么这个组合的sum一定小于该颜色的物品数量a[i],而且之前已经添加过了(a[i] + sum + 1) / 2,只要再添加上a[i] - (a[i] + sum + 1) / 2,就是a[i]剩下的这部分单独一个颜色作为一个group的数量。

总结:只能想到对单个组合进行暴力破解,用dp的话,没想到如何转移这种状态。这个思路真的是太爆炸了,被震撼到了。

void solve() {
	int n;
	cin >> n;
	const int mod = 998244353;
	vector<int> a(n + 1);
	for (int i = 1; i <= n; ++i){
		cin >> a[i];
	}

	int s = std::accumulate(a.begin() + 1, a.end(), 0);
	vector<long long> dp(s + 1);
	dp[0] = 1;
	for (int i = 1; i <= n; ++i){
		for (int j = s; j >= a[i]; --j){
			dp[j] += dp[j - a[i]];
			dp[j] %= mod;
		}
	}

	long long ans = 0;

	for (int i = 1; i <= s; ++i){
		ans += (1ll * i + 1) / 2 * dp[i];
		ans %= mod;
	}

	for (int i = 1; i <= n; ++i){
		for (int j = 0; j < a[i]; ++j){
			ans += (a[i] - (a[i] + j + 1) / 2) * dp[j];
			ans %= mod;
		}
	}
	cout << ans << '\n';
}

标签:字符,Educational,Rated,颜色,int,Codeforces,cin,bob,dp
From: https://www.cnblogs.com/yxcblogs/p/18156865

相关文章

  • Codeforces Round 906 (Div. 2) E1
    时隔了不知道多久的补题。两个月吧,这是可是寒假的比赛。但是补题的时候还是遇到了很多问题。很重要的有一些地方能够简化,一些条件没有充分的利用上,导致了我很多地方考虑的太复杂。这些能够简化的地方全部利用上我觉得才算是写出来了这道题目,否则这题会复杂到我赛时写不完,而且特......
  • CodeForces 115D Unambiguous Arithmetic Expression
    洛谷传送门CF传送门直接区间dp可以做到\(O(n^3)\),卡常可过,在此就不赘述了。为了方便先把连续的数字缩成一段。我们考虑直接从前往后扫,扫的过程中dp。设\(f_{i,j}\)为考虑了\([1,i]\),还有\(j\)个没配对的左括号的方案数。但是我们发现我们不知道一个数字前要添加几......
  • Codeforces Round 940 (Div. 2) and CodeCraft-23
    A.Stickogon#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64usingvi=vector<int>;constintN=3e5,mod=1e9+7;voidsolve(){ vicnt(101); intn; cin>>n; for(i......
  • Codeforces Round 892 (Div. 2) 复盘
    A没啥好说的。B也是,很简单的贪心。但是AB都因为读题导致的理解误差wa了一发。哎,读题读错,只能说英语还得练。C,赛时没做出来,后面的也是。这个题目其实思路已经有了,cf的这种题,还放在C题,那就是很明显那种能打标看出规律的东西。就算知道了是打表能看出来的,我懒得写暴力,所以就一直......
  • Codeforces Round 940 (Div. 2) and CodeCraft-23
    CodeforcesRound940(Div.2)andCodeCraft-23前四题难度适中,总体还算不错,我想想都能做。E题考察威尔逊和质数筛前缀和算贡献。F题是数据结构,据说很版,还没补。A题:题意:给出n个木棍,最多组成多少个多边形Solution:统计各长度木棍的数量,全部贪心成三角形voidsolve(){ cin>>n;......
  • Codeforces 1863F Divide, XOR, and Conquer
    记\(s_{l,r}=\oplus_{i=l}^ra_i\)。考虑到这个相当于是\([l,r]\)内分裂区间,可以考虑区间\(\text{DP}\)。即记\(f_{l,r}\)为\([l,r]\)区间是否能被遍历到。转移考虑对于\([l,r]\),考虑在已知的条件下(\(len\ger-l+1\))\([l,r]\)是否合法。即到这个状态......
  • Codeforces Round 940 (Div. 2) and CodeCraft-23 (补题中的小白)
    A.Stickogon思路:Code:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;cin>>n;map<int,int>mp;for(inti=1,x;i<=n;i++){cin>>x;mp[x]++;}intans=0;f......
  • Codeforces Round 940 (Div. 2) and CodeCraft-23
    目录写在前面ABCDE写在最后写在前面比赛地址:https://codeforces.com/contest/1957。大病场妈的A签到。尽可能凑三角形。///*By:Luckyblock*/#include<bits/stdc++.h>#defineLLlonglong//=============================================================//======......
  • Codeforces Round 940 (Div. 2)
    这场还挺Edu的C.HowDoestheRookMove?Problem-C-Codeforces数学方法​ 我用的数学方法,卡了很久才推出来思路和式子。​ 首先行列其实等价,直接单考虑剩余\(n\)行就行。​ 这类题应该选择先选一个东西,然后处理剩下的东西。​ 这里好做的方法是先选\(m\)个......
  • Codeforces 954H Path Counting
    令输入的为\(a'\),同时\(a'_0=1\)。对其做一个前缀积\(a_i=\prod\limits_{i=0}^ia'_i\),对于\(i\gen\),认为\(a_i=0\)。那么\(a_i\)就相当于是深度\(i+1\)的点的个数。同时也可以得到根的深度为\(l\)时子树内深度为\(r\)的深度的点数为\(\dfrac{a_{r-......