已经很久没有做过tc了,虽然本来rating也不高,但是现在要是重新做起来的话可能一下就从div1掉到div2了。但是还是打算重新捡起来,真是觉得现在代码能力太弱,而且算法也几乎都忘得差不多了。一开始是想拿div2的250来给新学Java练练手,然后就想着顺带连C++也一起练吧。算法什么的遇到一个学一个好了。
首先要安好插件,方便一点。http://www.cnblogs.com/zhj5chengfeng/archive/2013/03/11/2954743.html
然后看了一下把4月4号的错过去了,明天晚上11点还有一场,估计再做的时候我就要在div2了呜呜。。先在practice room里做了一下4号的SRM615,顺道就练一下描述题意好了哈哈。
SRM615_div2_250:AmebaDiv2
题意:给一个数A和一个vector X,A顺次遇到X中数,如果和自己一样,就把自己变成2A,返回最终输出的数。X中最多200个数,数的范围是1到1000,000,000。
题解:直接模拟,直接贴代码
1 int simulate(vector <int> X, int A) 2 { 3 int N = X.size(); 4 for(int i = 0; i < N; i++) 5 { 6 if( X[i] == A) 7 A = A << 1; 8 } 9 return A; 10 }
SRM615_div2_500:LongLongTripDiv2
题意:D米长的路,跳T次,每次可以跳1米或B米,问能否可能。D is [1,10^18], T is [1,10^9], B is [2, 10^9],都是整数。
题解:求二元一次方程组的整数解{x+y=T; x+By=D},只需要判断不能整数解的情况:1)D<T; 2)无整数解 3)跳的次数超过T才能跳够D米
1 string isAble(long long D, int T, int B) 2 { 3 long long x = D-T; 4 string yes = "Possible"; 5 string no = "Impossible"; 6 if(x < 0) return no; 7 if(x%(B-1) != 0) return no; 8 if(x/(B-1) > T) return no; 9 return yes; 10 11 }
SRM615_div1_250:AmebaDiv1
题意:同div2_250,但是输入只有一个vector X,假设给一个整数A,求遍历一遍X之后不可能出现的A个数。
题解:我是给想复杂了,一开始我想到了vector中没出现过的数,最终都可能出现,因为遍历一次之后输入的数本身都不会变,但是vector中的数也有可能会出现,eg.{3,2,1},最终2会出现是因为1的存在,关键就是要找到这些在vector中出现过但是却能通过别的数的变化从而最终出现的数。其实只需要,遍历一遍vector,检验它是否能最终出现即可。
1 int count(vector <int> X) 2 { 3 set<int> no; 4 int n = X.size(); 5 for(int i = 0; i < n; i++) 6 no.insert(X[i]); 7 for(int i = 0; i < n; i++) 8 { 9 int x = X[i]; 10 for(int j = 0; j < n; j++) 11 if(x == X[j]) 12 x *= 2; 13 if(no.find(x) != no.end()) 14 no.erase(x); 15 } 16 return no.size(); 17 }
先暂时做这三个,其实这么久没有做过真的都忘的一干二净了,最明显的就是STL真的全忘了,每遇到一个新的container,都需要重新查它的用法
1. vector
1 vector<int> v; //遍历v只需要将其当成数组就好 2 int n = v.size(); // 返回元素个数 3 bool e = v.empty(); //返回vector是否为空 4 int f = v.front() //返回第一个元素 5 int b = v.front() //返回最后一个元素 6 7 v.push_back(x); 8 v.pop_back(); 9 v.clear(); 10 v.erase(v.begin(), v.begin()+3) //去掉前3个元素
2. set
1 set<int> s; 2 s.count(x) //返回x的个数 3 set<int>::iterator it; 4 it = s.find(x) //返回x的指针,如果不存在,返回s.end() 5 //*it == x