Day1
B题
G题 CodeForces 91B
JAVA BigDecimal函数的使用 八进制小数转十进制小数(白学Java课了,搞半天搞不出来)
import java.util.*; import java.io.*; import java.math.BigDecimal; public class Main { public static void main(String[] args) throws IOException { Scanner cin=new Scanner(new BufferedInputStream(System.in)); BigDecimal x=new BigDecimal(1); BigDecimal y=new BigDecimal(8); String n=null; while(cin.hasNext()) { BigDecimal ans=new BigDecimal(0); BigDecimal bit=x.divide(y); n=cin.next(); for(int i=2;i<n.length();++i) { ans=ans.add(bit.multiply(new BigDecimal(n.charAt(i)-'0'))); bit=bit.divide(y); } System.out.println(n+" [8] = "+ans.toString()+" [10]"); } } }
Day2
B题
C题
F题
大概就是,给一个长度为N的序列,求其中每个元素与位于它右边、比它小、且位置最右边的元素的距离。
具体做法是,从右至左,维护一个单调递减的栈(即当元素比栈顶元素小时将其入栈),每当当前元素比栈顶元素大的时候,在栈中找到比当前元素小且最大的元素(这个过程可以用lower_bound函数或者二分查找),就可以求出答案了。
lower_bound (没想到lower_bound还可以这么用。。涨知识了)
#include<cstdio> #include<algorithm> using namespace std; #define maxn 100005 int a[maxn],ans[maxn],stk[maxn],num[maxn],top; bool cmp(int x,int y){return x>y;} int main() { int i,n,it,ma=0; scanf("%d",&n); for (i=1;i<=n;i++) { scanf("%d",&a[i]); if (a[i]>ma) ma=a[i]; } stk[0]=ma+1; for (i=n;i>=1;i--) { if (stk[top]>a[i]) { stk[++top]=a[i]; num[top]=i;ans[i]=-1; } else if (stk[top]==a[i]) ans[i]=-1; else if (stk[top]<a[i]) { it=lower_bound(stk+1,stk+top+1,a[i],cmp)-stk; if (a[i]==stk[it]) it++; ans[i]=num[it]-i-1; } } for (i=1;i<=n;i++) printf("%d ",ans[i]); return 0; }
二分版本(部分)
else if (stk[top]<a[i]) { l=1;r=top; while (l<=r) { mid=(l+r)>>1; if (stk[mid]>=a[i]) l=mid+1; else r=mid-1; } ans[i]=num[l]-i-1; }