Topcoder SRM200

    技术2024-07-04  78

    今天做一套简单的SRM,找找手感。

     

    [DIV_2]

     

    (250pts) NoOrderOfOperations:简单模拟,按照字符串顺序进行运算,每次取出相邻的一个运算符和一个数字,直接计算即可。 class NoOrderOfOperations { public: int cal(int now,char ope,char s) { int num=s-'0'; if (ope=='+') return now+num; else if (ope=='-') return now-num; else if (ope=='*') return now*num; } int evaluate(string expr) { int len=expr.size(); int ans=expr[0]-'0'; for (int i=1;i<len;i+=2) ans=cal(ans,expr[i],expr[i+1]); return ans; } }; (500pts) GravityBomb:简单模拟(⊙o⊙),判断每一列的底部会有几个'X',易知最终消去的行数即为这些值中的最小值,然后模拟消去过程,保存答案。

    vector <string> gg; int cnt[1000]; class GravityBomb { public: vector <string> aftermath(vector <string> board) { int n=board.size(); int m=board[0].size(); memset(cnt,0,sizeof(cnt)); gg.clear(); for (int i=0;i<m;i++) for (int j=0;j<n;j++) if (board[j][i]=='X') cnt[i]++; int min=10000; for (int i=0;i<m;i++) if (cnt[i]<min) min=cnt[i]; for (int i=0;i<m;i++) cnt[i]-=min; for (int i=0;i<n;i++) { string temp=board[0]; gg.PB(temp); } for (int i=0;i<n;i++) for (int j=0;j<m;j++) gg[i][j]='.'; for (int i=0;i<m;i++) for (int j=n-1;j>=n-cnt[i];j--) gg[j][i]='X'; return gg; } }; (900pts) WindowManager:简单模拟(⊙﹏⊙),对每一次覆盖操作,都扫描整个区域的每一个格子,根据格子的坐标和操作的要求,分别判断是边界点('+','-','|'),还是内部点,或者是外部点,然后进行相应的更新操作即可。

    vector <string> ans; class WindowManager { public: vector <string> screen(int height, int width, vector <string> windows) { string temp; temp.clear(); ans.clear(); for (int i=0;i<width;i++) temp.PB(' '); for (int i=0;i<height;i++) ans.PB(temp); int len=windows.size(); int tlv,tlh,vs,hs; char ope; for (int i=0;i<len;i++) { int len2=windows[i].size(); int temp=0,fu=0,cnt=0; for (int j=0;j<len2-1;j++) { if (windows[i][j]==' ') { if (fu) temp=-temp; if (cnt==0) tlv=temp; else if (cnt==1) tlh=temp; else if (cnt==2) vs=temp; else hs=temp; fu=0; cnt++; temp=0; } else { if (windows[i][j]=='-') fu=1; else temp=temp*10+windows[i][j]-'0'; } } ope=windows[i][len2-1]; for (int i=0;i<height;i++) for (int j=0;j<width;j++) { if (i==tlv) { if (j==tlh||j==tlh+hs-1) ans[i][j]='+'; else if (j>tlh&&j<tlh+hs-1) ans[i][j]='-'; } else if (i==tlv+vs-1) { if (j==tlh||j==tlh+hs-1) ans[i][j]='+'; else if (j>tlh&&j<tlh+hs-1) ans[i][j]='-'; } else if (j==tlh) { if (i>tlv&&i<tlv+vs-1) ans[i][j]='|'; } else if (j==tlh+hs-1) { if (i>tlv&&i<tlv+vs-1) ans[i][j]='|'; } else { if (i>tlv&&i<tlv+vs-1&&j>tlh&&j<tlh+hs-1) ans[i][j]=ope; } } } return ans; } };

     

     

    [DIV_1]

     

    (300pts) WindowManager:同DIV_2的900pts。

     

    (500pts) NCMultiplication:首先把原参数中的数组量用平常的方式进位处理,成为一个long long型的整数N,而后在1~sqrt(N)的范围内暴力枚举可行解,而后就可以按照题目的要求模拟乘法过程,如果可行,则记录,返回使A-B最小的A值即可。

    char sa[100],sb[100]; int num[100]; class NCMultiplication { public: long long findFactors(vector <int> digits) { int len=digits.size(); long long n=0; for (int i=0;i<len;i++) { n=n*10+digits[i]; } long long ans=-1; for (long long ii=1;ii*ii<=n;ii++) { if (n%ii!=0) continue; long long A=n/ii,B=ii; sprintf(sa,"%lld",A); sprintf(sb,"%lld",B); int lena=strlen(sa); int lenb=strlen(sb); memset(num,0,sizeof(num)); for (int i=0;i<lena;i++) for (int j=0;j<lenb;j++) { num[lena-1-i+lenb-1-j]+=(sa[i]-'0')*(sb[j]-'0'); } if (lena+lenb-1!=len) continue; bool find=true; for (int i=0;i<len;i++) { if (num[len-1-i]!=digits[i]) find=false; } if (find) ans=A; } return ans; } };

     

    (1000pts) 待更新 

     

    最新回复(0)