1. 程式人生 > >Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2)

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

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... 
 8
while(num>0&&n>=11) 9 { 10 num--; 11 n-=11; 12 ans++; 13 } 14 printf("%d\n",ans); 15 return 0; 16 }
View Code

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 }
View Code

C. Maximum Subrectangle

題意:

D. Social Circles

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