Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2)
阿新 • • 發佈:2018-10-05
lap numbers sin memset round number sub printf include
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... 8View Codewhile(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);View Code10 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
Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2)