标签:表示 sub 多少 eth 最大 namespace ... gif 记忆化
题意:给你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 }
题意:设正整数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 }
题意:
Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2)
标签:表示 sub 多少 eth 最大 namespace ... gif 记忆化
原文地址:https://www.cnblogs.com/hitsz-crz/p/9743874.html