上午10:00,绝好的SRM时间……
250:给出一个字符串,长度为N(N<=50),由字母'D'和‘I’构成,‘D’表示 a[i]>a[i+1]; 'I' 表示 a[i]<a[i+1]; 根据这个字符串,求一个长度为N+1的排列,如果多解存在,求字典序最小的……
乍一看有点懵……然后自然想到想办法缩减问题规模……刚开始想给1定位,然后缩减成2~N的子问题,不太好想……
于是反过来给N定位,由于要求字典序最小,我们尽量把N往右边放;因为N是最大的,所以肯定是“I”上去的……于是找到最右边的I,让他=N……然后如果后面有D,则顺序的N-1,N-2……然后问题就缩小了……
class PermutationSignature {
public int[] reconstruct (String str){
Str = "I"+str;
int n = str.length();
int[] ans = new int[n];
int right = n;
int now = n;
for (int i = n-1;i >= 0;i--){
if (str.charAt(i)=='I') {
for (int j = i;j<right;j++) {
ans[j] = now --;
}
right = i;
}
}
return ans;
}
}
之后的550,一个小编译器式的问题……我表示这种题我最苦手了……战略放弃……
之后的1000,大概是给你A,B,N,K,Upper_bound 和Lower_bound(long 级别),问 A*K %N , (A+1)*K %N ....(B)*K%N这些数里面,有多少个<=Upper_bound 且 >=Lower_bound的,写了写……最后交了个样例都不过的程序,瞬间被cha……
看了看神人的程序,思路大方向没问题,但是计数上面我的方法太拙劣了……
然后,不幸的是数据似乎出了点问题,一直都在rejudge……
最后rating 1493->1565,历史最高……又黄回去了~~