Codeforces Round #197

来源:互联网 发布:淘宝卖家信誉怎么清零 编辑:程序博客网 时间:2024/06/05 03:00

A题  数字排序

把输入的字符串里的数字挑出来,从小到大排序,每两个数字中间加一个加号就好

import java.util.*;public class Main{public static void main(String[] args){String s;Scanner cin = new Scanner(System.in);List<Integer> ls = new ArrayList<Integer>();s = cin.nextLine();for(int i=0;i<s.length();i++){if(Character.isDigit(s.charAt(i))){ls.add(Character.digit(s.charAt(i),10));}}Collections.sort(ls);for(int i=0;i<ls.size()-1;i++){System.out.print(ls.get(i)+"+");}System.out.println(ls.get(ls.size()-1));cin.close();}}

B题  模拟

不解释

import java.util.*;public class Main{public static void main(String[] args){Scanner cin = new Scanner(System.in);int n = cin.nextInt();int m = cin.nextInt();int cur = 1;long ans = 0;for( int i=0;i<m;i++ ){int t = cin.nextInt();if( cur <= t ){ans = ans + t - cur;} else {ans = ans + n - (cur - t);}cur = t;}System.out.println(ans);cin.close();}}

C题   深度优先搜索

有重量为1到10的物品N个   全部放在天平两边    先放左再放右    要求每一次放的跟上次不同    每次放上去天平都得沉下来

dfs

import java.util.*;public class Main{private static List<Integer> ls = new ArrayList<Integer>();private static List<Integer> ans = new ArrayList<Integer>();private static boolean flag = false;private static int n;private static void display(){System.out.println("YES");int sz = ans.size();for( int i=0;i<sz-1;i++ ){System.out.print(ans.get(i)+" ");}System.out.println(ans.get(sz-1));}private static void dfs(int sum1,int sum2,int num,int last){int sz = ls.size();if( flag ) return;if( num == n ){flag = true;display();return;}for( int i=0;i<sz;i++ ){if( num%2==0 && last != ls.get(i) && sum1+ls.get(i)>sum2 ){ans.add( ls.get(i) );dfs( sum1+ls.get(i),sum2,num+1,ls.get(i) );ans.remove( ans.size()-1 );}else if ( num%2==1 && last != ls.get(i) && sum2+ls.get(i)>sum1 ){ans.add( ls.get(i) );dfs( sum1,sum2+ls.get(i),num+1,ls.get(i) );ans.remove( ans.size()-1 );}}}public static void main(String[] args){Scanner cin = new Scanner(System.in);String s = cin.nextLine();for( int i=0;i<s.length();i++ ){if( s.charAt(i)=='1' ){ls.add( i+1 );}}n = cin.nextInt();dfs(0,0,0,-1);if( !flag ){System.out.println("NO");}cin.close();}}

D题  线段树

交替进行或和异或运算    给m次替换的值    求新的值

用线段树维护

import java.util.*;public class Main{final static int MAXN = 350000;public static int[] A = new int[MAXN];private static Segment_Tree tree = new Segment_Tree();public static void main(String[] args){Scanner cin = new Scanner(System.in);int n = cin.nextInt();int m = cin.nextInt();int t = (1<<n);for( int i=1;i<=t;i++ ){A[i] = cin.nextInt();}tree.build(1,1,t,n);for( int i=0;i<m;i++ ){int p = cin.nextInt();int q = cin.nextInt();tree.update(1,p,q);System.out.println(tree.getNode());}cin.close();}}class Segment_Tree{class Node{int l,r,val,dep;void init(int al,int ar,int adep){l=al;r=ar;val=Main.A[l];dep=adep;}}private Node[] t = new Node[Main.MAXN];public Segment_Tree(){for(int i=0;i<Main.MAXN;i++)t[i]=new Node();}public int getNode(){return t[1].val;}private void push_up(int f,int l,int r){if( t[f].dep%2==1 ) t[f].val = t[l].val|t[r].val;else t[f].val = t[l].val^t[r].val;}public void build( int idx,int l,int r,int depth){t[idx].init(l,r,depth);if(l==r) return;int mid = (l+r)>>1;build( idx*2,l,mid,depth-1);build( idx*2+1,mid+1,r,depth-1);push_up(idx,idx*2,idx*2+1);}public void update( int cur,int x,int num ){if( t[cur].l==t[cur].r ){t[cur].val = num;return;}if( x <= (t[cur].l+t[cur].r)/2 ) update( cur*2,x,num );else update( cur*2+1,x,num);push_up(cur,cur*2,cur*2+1);}}

E题  dfs

因为将一个正常序列经过一些操作可以得到一个目标序列    那么将目标序列倒着操作就可以得到正常序列

递归完成

import java.util.*;public class Main{private static int[] a = new int[2000];private static int n;private static List<Pair> ls = new ArrayList<Pair>();private static boolean flag = false;private static int findl(){for( int i=1;i<=n;i++ ) if(a[i]!=i)return i;return 0;}private static int findr(){for( int i=n;i>=1;i-- ) if(a[i]!=i)return i;return 0;}private static int getpos(int x){for( int i=1;i<=n;i++ ) if(a[i]==x)return i;return 0;}private static void reverse(int[] arr,int b,int e){while( b<e ){int t=arr[b];arr[b]=arr[e-1];arr[e-1]=t;b++;e--;}}private static void display(){int len=ls.size();System.out.println(len);for(int i=len-1;i>=0;i--){System.out.println(ls.get(i).key+" "+ls.get(i).value);}}private static void dfs(int dep){int l=findl();if( l==0&&dep<=3 ){display();flag = true;return;}if(dep>3) return;int r = getpos(l);reverse(a,l,r+1);ls.add(new Pair(l,r));dfs(dep+1);ls.remove(ls.size()-1);reverse(a,l,r+1);if(flag) return;r=findr();l=getpos(r);reverse(a,l,r+1);ls.add(new Pair(l,r));dfs(dep+1);reverse(a,l,r+1);ls.remove(ls.size()-1);}public static void main(String[] args){Scanner cin = new Scanner(System.in);n=cin.nextInt();for(int i=1;i<=n;i++){a[i] = cin.nextInt();}dfs(0);cin.close();}}class Pair{public int key;public int value;public Pair( int ak,int av){key = ak;value = av;}}


原创粉丝点击