Topcoder SRM201

    技术2024-07-06  70

    先把DIV2的解题报告写好。[DIV_2](250pts) Multiples:给定一个区间[a,b]和一个整数factor,问该区间内有多少元素是factor的倍数。方法多种多样,因为给出的factor很小,分别求出距离a和b最近的factor的倍数ma和mb,答案就是(mb-ma)/factor+1。

    class Multiples { public: int number(int min, int max, int factor) { while (min%factor!=0) min++; while (max%factor!=0) max--; return (max-min)/factor+1; } };

     

    (500pts) ElevatorLimit:枚举可能的人数,按照输入数据模拟上下电梯的情形,判断最大值和最小值即可。

    class ElevatorLimit { public: vector <int> ans; vector <int> getRange(vector <int> enter, vector <int> exit, int physicalLimit) { ans.clear(); int len=enter.size(); int min=1010,max=-1; for (int i=0;i<=physicalLimit;i++) { int num=i,find=1; for (int j=0;j<len;j++) { num-=exit[j]; if (num<0) find=0; num+=enter[j]; if (num>physicalLimit) find=0; } if (find) {min=min>i?i:min; max=max<i? i:max;} } if (min==1010&&max==-1) return ans; else { ans.PB(min); ans.PB(max); return ans; } } };

     

    (1000pts) WordSpaces:枚举起点和字符间距,只要存在解,那么就把起点位置记录,并跳出循环。

    class WordSpaces { public: vector <int> ans; vector <int> find(string sentence, vector <string> words) { ans.clear(); int len=sentence.size(); int len2=words.size(); for (int i=0;i<len2;i++) { int len3=words[i].size(); bool find=false; for (int j=0;j<len;j++) { bool ok=false; for (int k=1;k<=len;k++) { bool ok1=true; for (int l=0;l<len3;l++) { if ((j+k*l)>=len) ok1=false; else if (sentence[j+k*l]!=words[i][l]) ok1=false; } if (ok1) ok=true; } if (ok) { ans.PB(j); find=true; break; } } if (!find) ans.PB(-1); } return ans; } };

    最新回复(0)