usaco 4.1 Fence Rails
来源:互联网 发布:windows phome 编辑:程序博客网 时间:2024/05/08 21:07
/*ID: daniel.20LANG: JAVATASK: fence8*/import java.io.*;import java.math.BigInteger;import java.util.*;class problem{ int[] boards; int[] rails; int[] rails_sum; int tot_boards; int boards_copy[]; int waste; StringBuilder sb = new StringBuilder(); void buble_sort(){ for(int i=0;i<boards.length;i++){ for(int j=i+1;j<boards.length;j++){ if(boards[i]<boards[j]){ int tmp = boards[i]; boards[i] = boards[j]; boards[j] = tmp; } } } } void solver() throws IOException{ long start = System.currentTimeMillis(); //BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); BufferedReader reader = new BufferedReader(new FileReader("fence8.in")); PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("fence8.out"))); int n = Integer.valueOf(reader.readLine()); boards = new int[n]; boards_copy = new int[n]; for(int i=0;i<n;i++){ boards[i] = Integer.valueOf(reader.readLine()); tot_boards += boards[i]; } int r = Integer.valueOf(reader.readLine()); rails = new int[r]; rails_sum = new int[r]; for(int i=0;i<r;i++){ rails[i] = Integer.valueOf(reader.readLine()); } Arrays.sort(rails); buble_sort(); for(int i=0;i<r;i++){ rails_sum[i]=rails[i]+(i>0?rails_sum[i-1]:0); } while(r>0&&rails[r-1]>boards[0]) r--; while(n>0&&boards[n-1]<rails[0]) n--; if(r==0||n==0){ sb.append(0); }else{ int left=0,right=r-1; int mid = (left+right+1)/2; while(left<right){ System.arraycopy(boards, 0, boards_copy, 0, n); waste = 0; if(dfs(mid, 0, n-1, tot_boards-rails_sum[mid])){ left = mid; mid = (left+right+1)/2; }else{ right = mid-1; mid = (left+right+1)/2; } } sb.append(mid+1); } System.out.println(sb.toString()); out.println(sb.toString()); out.close(); System.out.println("$:"+(System.currentTimeMillis()-start)); System.exit(0); } boolean dfs(int rail_deep, int board_start, int n, int maywaste){ if(rail_deep<0) return true; if(boards_copy[board_start]>rails_sum[rail_deep]) return true; if(waste>maywaste) return false; boolean vis[] = new boolean[boards[0]+1]; for(int i=board_start;i<=n;i++){ if(boards_copy[i]<rails[rail_deep]) continue; if(vis[boards[i]]) continue; vis[boards[i]] = true; boards_copy[i]-=rails[rail_deep]; if(boards_copy[i]<rails[0]) waste+=boards_copy[i]; int next_start = 0; if(rail_deep>0&&rails[rail_deep]==rails[rail_deep-1]){ next_start = i; } if(dfs(rail_deep-1,next_start,n,maywaste)) return true; if(boards_copy[i]<rails[0]) waste-=boards_copy[i]; boards_copy[i]+=rails[rail_deep]; } return false; }}public class fence8 { public static void main (String [] args) throws Exception { problem p = new problem(); p.solver(); }}
好困难的搜索题。
而且java有点被卡时间,一些特殊的case java时间不太够...
DFSID还是不太会,需要多学习
0 0
- usaco 4.1 Fence Rails
- usaco 4.1 Fence Rails 剪枝
- USACO 4.1 Fence Rails (fence8)
- USACO Section 4.1 Fence Rails
- usaco 4.1.2 Fence Rails 搜索剪枝
- usaco training 4.1.2 Fence Rails 题解
- USACO Fence Rails 解题报告
- usaco 4.1.2 Fence Rails栅栏的木料
- [usaco]4.1.3 Fence Rails 多维背包问题,dfsid
- USACO Section 4.1 Fence Rails - 用DFSID解多维背包..
- USACO section 4.1 Fence Rails(搜索+优化)
- USACO 6.3.1 Fence Rails dfsid+剪枝
- Section 4.1 Fence Rails
- USACO 4.1 Fence loop
- USACO 4.1 Fence Loops (fence6)
- USACO Section 4.1 Fence Loops
- usaco 4.1.3 Fence Loops
- Fence Rails
- hdu-1231-最大连续子序列
- 【Javascript】OOP ‘终端' demo
- Cohen-Sutherland裁剪算核心代码
- 小明的调查统计
- 算法竞赛入门经典 5.2.3高精度运算类bign(BigN)
- usaco 4.1 Fence Rails
- 算法竞赛入门经典 5.2.2高精度阶乘
- boost::asio译文
- 算法竞赛入门经典 5.2.1有多少位进位
- 腾讯大规模Hadoop集群实践
- 算法竞赛入门经典 5.1.3找串的最小重复周期
- 职业技术女性怎样做好职业规划
- python+Tornado + Supervisor + nginx部署
- 算法竞赛入门经典 例题4-2孪生素数