Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2)

A.Phone Numbers

题意:给你n个数字,每个数字最多只能用一次,问你最多能组成以8开头的11位电话号码有多少个

思路:模拟即可,注意char数组读入是从0下标开始的(在这里被hack了...)

 1 #include<bits/stdc++.h>
 2 int main()
 3 {
 4     int n,num=0,ans=0;
 5     char c[105];
 6     scanf("%d%s",&n,c);
 7     for(int i=0;i<n;i++)if(c[i]==‘8‘)num++;//原来是从1到n...
 8     while(num>0&&n>=11)
 9     {
10         num--;
11         n-=11;
12         ans++;
13     }
14     printf("%d\n",ans);
15     return 0;
16 }

B. Maximum Sum of Digits

题意:设正整数a,b和为n,现给定n,求每位数字和最大的一组(a,b),这个和为多少

思路:由于是求每位数字的和,所以具体地考虑对一个具体数位的分割,发现对于一个确定的数ai,无论怎样分,是否借位/被借位,其和都是ai,而对于不同分法产生差异的原因在于是否借位

  由此可以记忆化dfs,设f(id,bor,Now)表示到第id位,是否被借位(0,1),当前数码和为Now

  要注意借位与不借位情况的判定(原来来少考虑了没有借位过的9不能借位,被hack了)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int ans=0,a[15]={0};
 4 int Mark[15][5][255]={0};
 5 int dfs(int id,int bor,int Now)
 6 {
 7     if(id==a[0]+1)
 8     {
 9         ans=max(ans,Now);
10         return ans;
11     }
12
13     if(Mark[id][bor][Now]!=-1)return Mark[id][bor][Now];
14
15     int tmp=0;
16     if(a[id]!=0)tmp=max(tmp,dfs(id+1,0,Now+a[id]-bor));
17     //µ±Ç°Î»²»ÎªÁãÔò¿¼ÂDz»ÏòÏÂһλ½èλµÄÇé¿ö£¨Îª0Ôò½èλ±ØÈ»¸üÓÅ£¬ÇÒ°üº¬Á˱»½èλµÄÇé¿ö£©
18     if(id!=a[0]&&(!(a[id]==9&&bor==0)))tmp=max(tmp,dfs(id+1,1,Now+a[id]+10-bor));
19     //¸ÃλÖò»Îª×î¸ßλÇÒ²»ÎªÃ»±»½èλ¹ýµÄ9£¬Ôò¿¼ÂÇÏòÏÂһλ½èλ
20     //Ô­À´ÉÙ¿¼ÂÇÁËûÓнèλ¹ýµÄ9²»Äܽèλ
21
22     return Mark[id][bor][Now]=tmp;
23 }
24 int main()
25 {
26     long long n;
27     scanf("%lld",&n);
28     while(n)
29     {
30         a[++a[0]]=n%10;
31         n/=10;
32     }
33     memset(Mark,-1,sizeof(Mark));
34     dfs(1,0,0);
35     printf("%d\n",ans);
36     return 0;
37 }

C. Maximum Subrectangle

题意:

D. Social Circles

原文地址:https://www.cnblogs.com/hitsz-crz/p/9743874.html

时间: 2024-10-08 20:44:02

Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2)的相关文章

[Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) ](A~E)

A: 题目大意:给你一个数字串,每个数字只可以用一次,求最多可以组成多少个电话号码(可以相同),电话号码第一个数字为$8$,且长度为$11$ 题解:限制为$8$的个数和总长度,直接求 卡点:无 C++ Code: #include <cstdio> #include <algorithm> #define maxn 1000 inline int min(int a, int b) {return a < b ? a : b;} inline int max(int a, i

Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) C. Maximum Subrectangle

昨天做的,今天才想起来,要写个博客,记一下这种矩阵题怎么做. 首先我没有意识到,每个方向上累和,得到两个累和数组,它们的子序列之积,就是子序列对应的矩形区域范围内所有数字之和,说起来有点抽象,但是举个栗子吧, 就像用例里面的这张提示图,横坐标我选子列2,3,则和为5,纵坐标我选子列1,2,则和为3.那么3和5,乘积为15,而把矩阵中对应区域的和相加,也是15,.则这个问题就容易了:只需要枚举一维数组就可以了.但是,如果枚举一维数组,那岂不是要做一个四重循环?其实不然. 题目要我们获得一个不大于限

Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) C D

C - Maximum Subrectangle 因为是两个数组相乘的到的 矩阵所以  a(i ->j)*b(x->y) 的面积 就是   a(i ->j) 的和乘与b(x->y)的和 所以我们枚举 a 序列 从1-n的长度和  B序列同理 然后 枚举两个序列和相乘 找一个最大即可 #include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define LL long long #defin

Codeforces Round #513 游记

Codeforces Round #513 游记 A - Phone Numbers 题目大意: 电话号码是8开头的\(1\)位数字.告诉你\(n(n\le100)\)个数字,每个数字至多使用一次.问最多能凑出多少个电话号码. 思路: 统计8出现的次数,如果有多余的8不能作为开头,那么就将其放到后面去 源代码: #include<cstdio> #include<cctype> #include<algorithm> inline int getint() { regi

Codeforces Round #513(Div.1+Div.2)

闲谈: 重新写博客的第一场比赛,感觉炸裂,成功被Rose和xgcD飞 A 题目: 给出一段长为n个数字字符串,求出能用里面的字符来构成多少个长度为11且开头字符为8的字符串 题解: 直接在n/11和8出现的数量中取min就可以了 参考代码: #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace

Codeforces Round #513解题报告(A~E)By cellur925

我是比赛地址 A:Phone Numbers $Description$:给你一串数字,问你能组成多少开头为8的11位电话号码. $Sol$:统计8的数量,与$n$%11作比较. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 5 using namespace std; 6 7 int n,len,cnt,ans; 8 char ch[1000]; 9 10 int main() 11 {

Codeforces Round #513 D - Social Circles(贪心)

题目大意: 有n(n≤105)个人排成一圈,第i个人要求自己左边空出li个座位,右边空出ri(li,ri≤109)个座位.问最少需要安排多少个座位.思路: 一开始先假设每个人都占了li+ri+1个位置.考虑怎样安排相邻人的顺序,并合并相邻人的li,ri使得答案最优.将所有li,ri分别排序,将对应的li,ri合并一定是最优的(想一想这是为什么). #include <iostream> #include <iomanip> #include <algorithm> #i

Educational Codeforces Round 36 (Rated for Div. 2)

Educational Codeforces Round 36 (Rated for Div. 2) F. Imbalance Value of a Tree You are given a tree T consisting of n vertices. A number is written on each vertex; the number written on vertex i is ai. Let's denote the function I(x,?y) as the differ

Educational Codeforces Round 36 (Rated for Div. 2) 题解

Educational Codeforces Round 36 (Rated for Div. 2) 题目的质量很不错(不看题解做不出来,笑 Codeforces 920C 题意 给定一个\(1\)到\(n\)组成的数组,只可以交换某些相邻的位置,问是否可以将数组调整为升序的 解题思路 首先如果每个数都能通过交换到它应该到的位置,那么就可以调整为升序的. 但实际上交换是对称的,如果应该在的位置在当前位置前方的数都交换完成,那么整体就是排好序的,因为不可能所有不在相应位置的数都在相应位置的后方.