首页 > 其他分享 >CF补题 991-Div

CF补题 991-Div

时间:2024-12-15 20:44:30浏览次数:4  
标签:991 int sum long ++ 补题 Div include 整除

CF补题 991-Div.3-20241210

Dashboard - Codeforces Round 991 (Div. 3) - Codeforces

A:

题目大意:给出 \(n\) 个字符串,求前多少个字符串的大小之和小于 \(m\)

#include <iostream>
#include <string>
using namespace std;

string a[52];

int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		int n, m;
		int flag = 0;
		cin >> n >> m;
		for (int i = 1; i <= n; i++)
			cin >> a[i];//读入所有字符串
		for (int i = 1; i <= n; i++) {
			if (m >= a[i].size()) {//如果能当前的m大于当前遍历的字符串的大小
				flag++;
				m -= a[i].size();//就把他减去
			}
			else break;//否则,退出
		}
		cout << flag << endl;//输出前flag个
		for (int i = 1; i <= n; i++) a[i].clear();//初始化
	}
	return 0;
}

签到题数据有点坑,调了很久

B:

题目大意:给定一个序列,每次选择其中一个元素,对他的左右两个元素分别做加减 \(1\) 操作,求能否使序列所有元素都变为相同

#include <string>
using namespace std;

int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		int n,a;
		int flag = 0;
		long long oddsum = 0, evesum = 0;
		scanf("%d", &n);
		for (int i = 1; i <= n; i++) {
			scanf("%d", &a);
			if (i % 2) oddsum += a;
			else evesum += a;
		}
		long long oddcnt = n % 2 == 0 ? n / 2 : n / 2 + 1, evecnt = n / 2;
		if (oddsum % oddcnt != 0 || evesum % evecnt != 0 || (oddsum / oddcnt)!= (evesum / evecnt))
			cout<<"NO"<<endl;
		else 
			cout<<"YES"<<endl;
	}
	return 0;
}

属于是不开 long long 见祖宗,题目只给出了 \(sum(n)<2e5\) 没说 \(sum(a)\) 的范围

所以调了很多次,发现需要开 long long 记录元素和

因为我们更改元素的值时,是对相同奇偶位的元素进行更改,所以我们需要保证 奇数位上的数偶数位上的数

他们各自的和都能被 奇数位个数偶数位个数 整除,且还要满足他们各自的平均值相等,才能使序列所有元素都变为相同

C:

题目大意:给出一个数,每次可以对它任意一个位置上的数进行平方操作(得到的数必须小于10),求能否得到能一个被 \(9\) 整除的数

#include <string>
#include <iostream>
#include <vector>
using namespace std;

bool check(vector<int> a) {
    int sum = 0, mem2 = 0, mem3 = 0;
    for (int i = 0; i < a.size(); i++) {
        if (a[i] == 2) mem2++;
        if (a[i] == 3) mem3++;
        sum += a[i];
    }
    if (mem3 >= 2 && sum % 9 == 0) return 1;
    if (mem2 >= 8) return 1;
    for (int i = 0; i <= mem2; i++)
        for (int j = 0; j <= mem3; j++)
            if ((sum + i * 2 + j * 6) % 9 == 0) return 1;
    return 0;
}

int main()
{
    int T;
    cin >> T;
    while (T--) {
        string s;
        vector<int> a;
        cin >> s;
        for (int i = 0; i < s.size(); i++)a.push_back(s[i] - '0');
        if (check(a)) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}

题目给出的数,它的位数小于 \(10^5\) 即最多有 \(100000\) 位,远远大于 long long 的范围

使用 string 读入数据,把每一位取出来存进 vector

关于一个数能否被 \(9\) 整除,有定理如下:

能被 \(9\) 整除的数,各个数位上的数字和能被 \(9\) 整除,那么这个数能被 \(9\) 整除

所以在 check 函数内取出每个位上的数,进行判断

根据题意,我们只能对 \(1,2,3\) 进行平方操作,而且 \(1\) 的平方仍然为 \(1\) ,只需要记录 \(2,3\) 的数量


由于 \(mod\ 9\) 的余数只有 \(\{1,2,3,4,5,6,7,8\}\) ,存在以下情况:

\(1+2*3=9,\ 2+2*8=18,\ 3+2*2=9,\ 4+2*7=18\)

\(5+2*2=9,\ 6+2*6=18,\ 7+2=9,\ 8+2*5=18\)

每次对 \(2\) 进行平方是,对 sum 的贡献为 +2 ,所以的余数都能由最多 \(8\) 个 \(2\) 所组合成为能被整除的数

故当 \(2\) 的数量大于等于 \(8\) 时,一定有解


由于 \(3\) 的平方对 sum 的贡献为 +3 ,且 \(3\) 次 +3 也会被 \(9\) 整除,所以有:

\(3\) 的数量大于等于 \(2\) 时, 若 sum 已是 \(3\) 的倍数,则一定能凑出解


剩下的情况只有 \(2,3\) 的数量分别小于 \(8,2\) ,直接枚举出所有情况再判断是否有解

D:

题目大意:给出一个数字串,每次可以选择其中非 \(0\) 和最左边的数字,将它减去 \(1\) 和左边的数字交换,求最大序字符串

#define _CRT_SECURE_NO_WARNINGS 
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int T;
string s;

int main()
{
    cin >> T;
    while (T--) {
        cin >> s;
        for (int i = 0; i < s.size(); i++) {
            
            int mmax = i, mempos = 0;
            for (int j = i; j < min(i + 10, (int)s.size()); j++) {
                if (s[mmax]-mempos < s[j] - j + i) {
                    mmax = j;
                    mempos = j - i;
                }
            }
            
            for (int j = mmax; j > i; j--) {
                s[j]--;
                swap(s[j], s[j - 1]);
            
            }
        }
        cout << s << endl;
    }
    return 0;
}

贪心的思想,由于我们最多只能把一个数减到 \(0\) ,所以对一个数,枚举它之后的所有能交换的数的枚举次数,最多不超过 \(9\) 次

数据范围满足时间限制,应该能够过

首先读入这个数字串,从最高位开始,对每一位都向后枚举 min(i + 10, (int)s.size()) ,记录枚举的过程中能让这个数交换后变得最大的 mmax下标,以及离当前数字的距离 mempos

枚举完后,从 mmax下标开始向前枚举,每次执行 -1swap 操作

最后输出 s 得到全局最优解

标签:991,int,sum,long,++,补题,Div,include,整除
From: https://www.cnblogs.com/dianman/p/18608666

相关文章

  • 使用button当按钮和使用div当按钮有什么区别?
    在前端开发中,使用<button>元素和<div>元素作为按钮时,有一些关键的区别,这些区别涉及到语义、可访问性、默认行为和样式等方面。1.语义<button>:语义明确,表示一个按钮,用于提交表单或触发某些动作。屏幕阅读器和其他辅助技术可以正确识别并宣布这是一个按钮,从而提高网站的......
  • icpc2024昆明补题记录
    D套娃这个trick是真没见过,也难怪场上没几个人过这个代码这么简单的题题目大意给定一排\(n\)个套娃,套娃的大小互不相同。你可以将相邻两个套娃套在一起,问最多能套几次?\[n≤10^5\]题解发现可以\(O(n)\)的判断一个长度为\(n\)的套娃序列是否能合并成一个,接下来从左边开始......
  • Codeforces Round 992 (Div. 2) C. Ordered Permutations
    给出数字n,构造一个符合的数组很容易想到,n1时,只有1符合。n2时,有12;21符合。n==3时,有123;132;231;321;发现必须分为1和2——n的两块数字,有某种递归的感觉,答案与2次方有关于是做出代码:#include<iostream>#include<algorithm>usingnamespacestd;#defineffp(x,y......
  • F - Diversity
    F-DiversityProblemStatementThereare$N$productsforsaleinastore.The$i$-thproducthasapriceof$P_i$yen,autilityvalueof$U_i$,andacolor$C_i$.Youwillchoosesomesubsetofthese$N$productstobuy(possiblynone).Thetotalprice......
  • AtCoder Regular Contest 189 (Div. 2)
    A计数B折叠差不变D观察性质暴力#include<bits/stdc++.h>usingnamespacestd;#definepbpush_back#defineendl'\n'#defineLLlonglongconstintN=5e5+10;intn,a[N],l[N],r[N];LLpre[N],suf[N],b[N];voidsolve(){cin>>n;......
  • cf补题日记
    听退役选手建议,补40道C、D题。(又又又开新专题。。。进度:2/100 原题1:Youaregivenastring ss,consistingofdigitsfrom 00 to 99.Inoneoperation,youcanpickanydigitinthisstring,exceptfor 00 ortheleftmostdigit,decreaseitby 11,and......
  • 写出不定宽度的子级div,在相对于固定宽度的父级元素水平居中的布局
    要实现不定宽子级div相对于固定宽度父级元素水平居中,可以使用几种方法:1.使用Flexbox:这是最现代化和推荐的方法,兼容性也很好。<divclass="parent"><divclass="child">不定宽度内容</div></div>.parent{width:500px;/*固定宽度*/display:flex;......
  • 使用div+css进行布局有什么好处?
    使用div+CSS进行布局在前端开发中有很多好处,总结如下:1.结构与样式分离:这是最重要的好处之一。HTML的div元素负责网页的结构和内容,而CSS负责网页的样式和外观。这种分离使得代码更清晰、易于维护和修改。例如,你可以轻松地改变整个网站的字体或颜色,而无需修改HTML结......
  • 请使用一个div写出有三条横线的小图标
    <divstyle="display:flex;flex-direction:column;height:24px;justify-content:space-between;width:24px;"><divstyle="height:2px;background-color:black;"></div><divstyle="height:2px;background......
  • CF 991(A~G)
    蒟蒻的第一篇题解。由于正值期末周,不想上太大强度,所以匆忙地vp了一场div3,并只出了A~E。A白给模拟题,但也是失误很大的一个题(7分钟时才出,属实是太慢了...)B一道典题,之前做过类似的。统计所有数的和sum,只有当sum%n==0时成立,即每个数最终都必须为sum/n。注意到最左边的数只......