## [POJ 2709] 顏料 (Painter)

### 樣例數據

 樣例輸入 樣例輸出 `3 40 95 21 07 25 60 400 250 0 60 0 5004 90 95 75 95 104 90 95 75 95 115 0 0 0 0 0 3330` `28234`

### Code

`#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=15;int a[maxn],b[maxn];bool cmp(int a,int b){ return a>b;}int main(){ int n,m,k; while(scanf("%d",&n)&&n) { for(int i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&m); sort(a,a+n); if(a[n-1]%50==0) k=a[n-1]/50; else k=a[n-1]/50+1; int t=0; for(int i=0;i<n;i++) b[i]=k*50-a[i]; while(t<m) { if(b[2]==0) { k+=1; for(int i=0;i<n;i++) b[i]+=50; } else { t++; b[0]--,b[1]--,b[2]--; sort(b,b+n,cmp); } } cout<<k<<endl; } return 0;}`

## [POJ 2393] 酸奶制造廠 (Yogurt Factory)

### 樣例數據

 樣例輸入 樣例輸出 `4 588 20089 40097 30091 500` `126900`

### Code

`#include<cstring>#include<cmath>#include<algorithm>#include<cstdlib>#include<cstdio>#include<iostream>#define LL long long#define MAXN 10010#define INF 0x3f3f3f3fusing namespace std;LL C[MAXN];LL Y[MAXN];LL cost;int main(){ int MAX=INF; int N,S; scanf("%d%d",&N,&S); for(int i=1;i<=N;i++) { cin>>C[i]>>Y[i]; if(C[i]>MAX+S) C[i]=MAX+S; MAX=C[i]; cost+=C[i]*Y[i]; } cout<<cost; return 0;}`

## [POJ 1877] 淹沒 (Flooded!)

### 樣例數據

 樣例輸入 樣例輸出 `3 325 37 4551 12 3494 83 27100000 0` `Region 1Water level is 46.67 meters.66.67 percent of the region is under water.`

### 解析

(Tips: 如果在POJ上一直莫名TLE,WA,RE，建議把默認語言的G++換成C++，玄學......)

圖-1

### Code

`#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;int n,m,T;int i;double v;double land[1000];int main(){ T=1; while(scanf("%d%d",&n,&m)!=EOF) { if(m==0&&n==0) return 0; for(i=0;i<n*m;i++) cin>>land[i]; cin>>v; sort(land,land+n*m); for(i=0;i<n*m-1;i++) { if(v<(land[i+1]-land[i])*(i+1)*100) break; v-=(land[i+1]-land[i])*(i+1)*100; } double h=land[i]+v/(i+1)/100; if(v==0) h=1; printf("Region %d\n",T++); printf("Water level is %.2f meters.\n",h); printf("%.2f percent of the region is under water.\n",(i+1)/((double)(n*m))*100); printf("\n"); } return 0;}`

## [POJ 1328] 雷達安裝 (Radar Installation)

### 題目描述

`我們假設海岸是無限延伸的直線，陸地在海岸的一邊，大海在另一邊。每個小島是一個點位於大海那一片區域。詳見圖片；` `每一個雷達的安裝位置只能夠在海岸線上，只能夠覆蓋半徑為 d 的圓形區域。所以，如果小島與雷達距離小於等於d才能夠覆蓋。` `我們可以用笛卡爾積坐標系，定義海岸線是 x軸，大海在x 上方，陸地在x 軸下方，給你每個小島在大海中的位置，並且給出雷達的覆蓋范圍 d ，你的任務是寫一個程序，找到最少需要安裝的雷達數量且能夠覆蓋所有的小島。一個位置表示(x,y)坐標。`

Figure A Sample Input of Radar Installations

### 輸入

`輸入是多組語句輸入； ` `每行包含兩個數 n 和 d：``n 代表小島的數量，d 代表雷達的覆蓋半徑；` `接下來n行是小島的位置，用一個二維坐標來表示Xi，Yi； ` `當輸入的 n 和 d 都為0，程序結束。 `

### 輸出

`對於每組數據輸出一個答案，每個答案占一行，輸出最小需要的雷達數量，如果不能夠滿足要求，則輸出 -1。`

### 樣例數據

 樣例輸入 樣例輸出 `3 2 ``1 2 ``-3 1 ``2 1 `` ` `1 2 ``0 2 `` ` `0 0 ` `Case 1: 2 ``Case 2: 1`

### 解析

圖-2

### Code

`#include<iostream>#include<cstring>#include<cmath>#include<cstdio>using namespace std;double x[10000],y[10000],ll[11000],rr[10000];int main(){ int n,d; int cnt=1; while(cin>>n>>d) { if(n==0&&d==0) break; int flag=1,sum=1; for(int i=0;i<n;i++) { cin>>x[i]>>y[i]; if(y[i]>d) flag=0; } cout<<"Case "<<cnt; cnt++; if(flag==0||d==0) { cout<<": -1"<<endl; continue; } int t; for(int i=0;i<n-1;i++) { for(int j=0;j<n-i-1;j++) { if(x[j]>x[j+1]) { t=x[j]; x[j]=x[j+1]; x[j+1]=t; t=y[j]; y[j]=y[j+1]; y[j+1]=t; } } } for (int i=0;i<n;i++) { double s=sqrt(d*d-y[i]*y[i]); ll[i]=x[i]-s; rr[i]=x[i]+s; } double x=rr[0]; for(int i=1;i<n;i++) { if(ll[i]>x) { x=rr[i]; sum++; } if(rr[i]<x) { x=rr[i]; } } cout<<": "<<sum<<endl; } return 0;}`

## [POJ 1018] 通訊系統 (Communication System)

### 題目描述

Pizoor Communications Inc.要建立一套通信系統，該通信系統需要n種設備，而每種設備分別可以有m1、m2、m3、...、mn個廠家提供生產，而每個廠家生產的同種設備都會存在兩個方面的差別：帶寬bandwidths 和 價格prices。

### 樣例數據

 樣例輸入 樣例輸出 `1 33 100 25 150 35 80 252 120 80 155 402 100 100 120 110` `0.649`

### Code

`#include<iostream>#include<cmath>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;const int Max=101;struct node{ double b; double p;};node a[Max][Max];double b[Max*Max];int m[Max];int bsize;int cmp(const void *a,const void *b){ return (*(double *)a)-(*(double *)b);}int main(){ int t,n; cin>>t; while (t--) { memset(a,0,sizeof(a)); memset(m,0,sizeof(m)); cin>>n; int i,j,k; int bsize=0; for (i=0;i<n;i++) { cin>>m[i]; for (j=0;j<m[i];j++) { cin>>a[i][j].b>>a[i][j].p; b[bsize++]=a[i][j].b; } } qsort(b,bsize,sizeof(b[0]),cmp); double mmax=0; double mmin; double sump=0; double temp=0; for (i=0;i<=bsize-1;i++) { sump=0; int changFlag = 0; for (j=0;j<n;j++) { mmin=32767; for (k=0;k<m[j];k++) { if (a[j][k].b>=b[i]&&a[j][k].p<mmin) { mmin=a[j][k].p; changFlag = 1; } } sump+=mmin; } if(!changFlag) break; temp=b[i]*1.0/sump; if(temp>mmax) mmax=temp; } printf("%.3lf\n",mmax); } return 0;}`

## [POJ 1083] 移動桌子 (Moving Tables)

ACM公司租用的樓層如下圖所示：

### 樣例數據

 樣例輸入 樣例輸出 `3 4 10 20 30 40 50 60 70 80 2 1 3 2 200 3 10 100 20 80 30 50 ` `102030`

### Code

`#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define N 202using namespace std;int n,flag[N],T;int main(){ scanf("%d",&T); while(T--) { int a,b,res=0; scanf("%d",&n); memset(flag,0,sizeof(flag)); for(int i=0;i<n;i++) { scanf("%d %d",&a,&b); if(a>b) { swap(a,b); } a=(a-1)>>1; b=(b-1)>>1; for(int j=a;j<=b;j++) flag[j]++; } for(int i=0;i<N;i++) res=max(res,flag[i]); printf("%d\n",res*10); } return 0;}`

## [HDU 1239] 再次呼叫地外文明(Calling Extraterrestrial Intelligence Again)

### 樣例數據

 樣例輸入 樣例輸出 5 1 299999 999 9991680 5 161970 1 12002 4 110 0 0 2 2313 31323 7343 4337 53

### Code

`#include<cstdio>#include<cmath>#include<cstring>using namespace std;int prim[100005],is[100005];int num=0;int Find(int v){ int m; int l=1,h=num; while(l<h) { m=(l+h)/2; if(prim[m]==v) return 1; if(prim[m]<v) l=m+1; else h=m; } return 0;}int main(){ int m,a,b,Max,j,i,x,zx,zi,z; double t; int s,e=(int)(sqrt(0.0+100000)+1); memset(is,1,sizeof(is)); prim[++num]=2; is[0]=is[1]=0; for(i=4;i<=100000;i+=2) is[i]=0; for(i=3;i<e;i+=2) if(is[i]) { prim[++num]=i; for(s=i*2,j=i*i;j<=100000;j+=s) is[j]=0; } for(;i<100000;i+=2) if(is[i]) prim[++num]=i; while(scanf("%d%d%d",&m,&a,&b)!=EOF) { z=0; if(m==0 && a==0 && b==0) break; t=a*1.0/b; for(int j=m;j>=1;j--) { if(j<z) break; Max=(int)sqrt(0.0+j); for(i=Max;i>=1;i--) { x=j/i; if(x*t<=i && x>=i) if(Find(i)&&Find(x)) if(x*i>z) { zx=x; zi=i; z=x*i; } } } printf("%d %d\n",zi,zx); } return 0;}`

## [UVA 1292] 戰略游戲 (Strategic Game)

### 輸入

1> 節點數N；
2> 接下來N行，每一行對一個節點進行具體描述，其格式如下：

### 樣例數據

 樣例輸入 樣例輸出 40:(1) 11:(2) 2 32:(0)3:(0)53:(3) 1 4 21:(1) 02:(0)0:(0)4:(0) `12`

### 解析

dp[i][1]=sum(dp[k][0])+1 k為i的子節點，下同，因為本節點沒放，則子節點一定要放
dp[i][0]=sum(min(dp[k][0],dp[k][1])) 因為本節點放了，所以取子節點放和不放的最小值

### Code

`#include<iostream>  #include<vector>  #include<cstring>  #include<cstdio>  #include<algorithm>  #include<cmath>  using namespace std;  const int maxn = 1600; int dp[maxn][2]; int n; vector<int> tree[maxn];  int min(int a,int b) {  return a<b?a:b; }  void dfs(int fa,int now) {  dp[now][0] = 0;  dp[now][1] = 1;   int len = tree[now].size();  int i;   for(i=0;i<len;i++)  {  int t=tree[now][i];  if(t!=fa)  {  dfs(now,t);  dp[now][0] += dp[t][1];  dp[now][1] += min(dp[t][0],dp[t][1]);  }  }  }   int main() {  while(~scanf("%d",&n))  {  int i;  for(i=0;i<n;i++)  {  tree[i].clear();  }  for(i=0;i<n;i++)  {  int b;  int a;  int j;  scanf("%d:(%d)",&a,&b);  for(j=0;j<b;j++)  {  int x;  scanf("%d",&x);  tree[a].push_back(x);  tree[x].push_back(a);  }  }  dfs(-1,0);  cout<<min(dp[0][0],dp[0][1])<<endl;  }  return 0; }`

## [POJ 3617] 最佳奶牛序列 (Best Cow Line)

### 樣例數據

 樣例輸入 樣例輸出 `6ACDBCB` `ABCBCD`

### Code

`#include<cstdio>#include<cstring>#include<iostream>#define MAXN 2010using namespace std;int n,str[MAXN];int main(){ scanf("%d",&n); char ch; for(int i=0;i<n;i++) { getchar(); ch=getchar(); str[i]=ch-'A'; } int pre=0,last=n-1,Count=0; for(int i=0;i<n;i++) { if(str[pre]==str[last]) { int pr=pre,la=last,flag=0; while(pr<=la) { if(str[pr]<str[la]) { printf("%c",str[pre]+'A'); Count++; flag=1; pre++; break; } else if(str[pr]>str[la]) { printf("%c",str[last]+'A'); Count++; flag=1; last--; break; } pr++,la--; } if(!flag) { printf("%c",str[pre]+'A'); Count++; pre++; } } else if(str[pre]<str[last]) { printf("%c",str[pre]+'A'); Count++; pre++; } else { printf("%c",str[last]+'A'); Count++; last--; } if(Count==80) { Count=0; printf("\n"); } } if(Count) printf("\n"); return 0;}`

## [POJ 3069] 薩魯曼的軍隊 (Saruman's Army)

### 樣例數據

 樣例輸入 樣例輸出 `0 310 20 2010 770 30 1 7 15 20 50-1 -1` `24`

### Code

`#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>#include<cstdio>#include<iostream>#define MAXN 1010using namespace std;int army[MAXN];int R,N;int main(){ while(scanf("%d%d",&R,&N)!=EOF) { if(R==-1&&N==-1) return 0; for(int i=1;i<=N;i++) { scanf("%d",&army[i]); } sort(army+1,army+N+1); int i=1,cnt=0; while(i<=N) { int bg=army[i++]; while(i<=N&&army[i]<=bg+R) { i++; } int st=army[i-1]; while(i<=N&&army[i]<=st+R) { i++; } cnt+=1; } printf("%d\n",cnt); memset(army,0,sizeof(army)); }}`

## [POJ 3253] 修理籬笆 (Fence Repair)

### 題目描述

Farmer John要去做籬笆，他一共需要N塊木板，也量出每塊木板需要多長。他買了這么一整塊木板，這個木板的長度是所有需要的木板長度之和。但是他沒有鋸子。於是他找朋友去借鋸子。可是朋友要收費。收費是這樣的，鋸開一塊長度為L的木板收費L元。請問Farmer John使用他朋友的鋸子，最少要花多少錢。

### 樣例數據

 樣例輸入 樣例輸出 `3858` `34`

### Code

`#include<iostream>#include<algorithm>#include<cstdio>#include<queue>using namespace std;priority_queue<int,vector<int>,greater<int> > pq;int main(){ int n(0); cin>>n; while(cin>>n) { pq.push(n); } long long sum(0); int l1(0),l2(0); while(pq.size()>1) { l1=pq.top(); pq.pop(); l2=pq.top(); pq.pop(); sum = sum+l1+l2; pq.push(l1+l2); } cout<<sum; return 0;}`

## [POJ 2376] 打掃谷倉 (Cleaning Shifts)

### 樣例數據

 樣例輸入 樣例輸出 `3 101 73 66 10` `2`

### Code

`#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef long long ll;const int maxn = 25000 + 5;const int maxd = 1000000 + 5;struct Edge{ int x; int y;}cow[maxn];int N,T;int X,Y;bool cmp(Edge a,Edge b){ if(a.x==b.x) return a.y>b.y; return a.x<b.x;}int main(){ X=0; Y=0; scanf("%d%d",&N,&T); for(int i=0;i<N;i++) { scanf("%d%d",&cow[i].x,&cow[i].y); if(cow[i].x==1) X=1; if(cow[i].y==T) Y=1; } sort(cow,cow+N,cmp); if(X==0||Y==0) { printf("-1\n"); return 0; } int ans=1,End=0; int Start=cow[0].y; int maxy=cow[0].y; while(true) { while(End+1<N&&cow[End+1].x<=Start+1) { End++; if(cow[End].y>maxy) { maxy=cow[End].y; } } if(maxy!=Start) { ans++; Start=maxy; } else { if(End==N-1) { break; } else { printf("-1\n"); return 0; } } } printf("%d\n",ans); return 0;}`

## [POJ 3190] 擠奶預訂 (Stall Reservation)

### 樣例數據

 樣例輸入 樣例輸出 `51 102 43 65 84 7` `412324`

<樣例解釋>

### Code

`#include<cstdio>#include<iostream>#include<algorithm>#include<queue>using namespace std;const int maxn=50000+10;int order[maxn];struct Node{ int st,en,pos; friend bool operator<(Node a,Node b) { if(a.en==b.en) return a.st<b.st; return a.en>b.en; }}node[maxn];bool cmp(Node a,Node b){ if(a.st==b.st) return a.en<b.en; else        return a.st<b.st;}priority_queue<Node>Q;int main(){ int n,ans; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) { scanf("%d%d",&node[i].st,&node[i].en); node[i].pos=i; } sort(node+1,node+1+n,cmp); ans=1; Q.push(node[1]); order[node[1].pos]=1; for(int i=2;i<=n;i++) { if(!Q.empty()&&Q.top().en<node[i].st) { order[node[i].pos]=order[Q.top().pos]; Q.pop(); } else { ans++; order[node[i].pos]=ans; } Q.push(node[i]); } printf("%d\n",ans); for(int i=1;i<=n;i++) printf("%d\n",order[i]); while(!Q.empty()) Q.pop(); } return 0;}`

## [POJ 3040] 津貼 (Allowance)

### 樣例數據

 樣例輸入 樣例輸出 `3 610 11 1005 120` `111`

### Code

`#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>const int INF=0x3f3f3f3f;using namespace std;struct node{ int val,mou;}mon[25];int n,c;int need[25];bool cmp(node a,node b){ return a.val<b.val;}int main(){ int i,ans,ti,rest,lim,mday; while(~scanf("%d%d",&n,&c)) { ans=0; lim=-1; for(i=0;i<n;i++) scanf("%d%d",&mon[i].val,&mon[i].mou); sort(mon,mon+n,cmp); for(i=n-1;i>=0;i--) if(mon[i].val>=c) ans+=mon[i].mou; else { lim=i; break; } while(1) { memset(need,0,sizeof need); rest=c; for(i=lim;i>=0;i--) { if(!mon[i].mou||!rest) continue; ti=rest/mon[i].val; ti=min(ti,mon[i].mou); need[i]=ti; rest-=ti*mon[i].val; } if(rest) { for(i=0;i<=lim;i++) { if(mon[i].val>=rest&&(mon[i].mou-need[i])) { need[i]++; rest=0; break; } } if(rest) break; } mday=INF; for(i=0;i<=lim;i++) if(need[i]) mday=min(mday,mon[i].mou/need[i]); ans+=mday; for(i=0;i<=lim;i++) mon[i].mou-=mday*need[i]; } printf("%d\n",ans); } return 0;}`

## [POJ 1862] Stripies (Stripies)

### 樣例數據

 樣例輸入 樣例輸出 `3723050` `120.000`

### Code

`#include<cstdio>#include<cstring>#include<queue>#include<cmath>#include<iostream>#include<algorithm>using namespace std;int main(){ int n; while(~scanf("%d",&n)) { priority_queue<double> q; for(int i=0;i<n;++i) { double tp; cin>>tp; q.push(tp); } while(q.size()>1) { double a=q.top();q.pop(); double b=q.top();q.pop(); double tp=2*sqrt(a*b); q.push(tp); } printf("%.3f\n",q.top()); } return 0;}`

## [POJ 3262] 保護花朵 (Protecting the Flowers)

### 題目描述

N (2 ≤ N ≤ 100,000)頭奶牛在Farmer John的花園里吃花，現在為了保護花朵，Farmer John要將這些奶牛都帶回牛棚里去。第i頭牛離牛棚有Ti (1 ≤ Ti ≤ 2,000,000)分鍾的路程， 在等待被送回牛棚的同時，這頭牛還要每分鍾吃掉Di (1 ≤ Di ≤ 100)朵花。而Farmer John每次只能帶一頭奶牛回到牛棚。

### 樣例數據

 樣例輸入 樣例輸出 `63 12 52 33 24 11 6` `86`

### Code

`#include<cstdio>#include<cstring>#include<algorithm>#define LL long long #define INF 0x3f3f3f3fusing namespace std;struct node{   LL x;   LL y;      }a[100010];int cmp(node n,node m){   return n.y*m.x>m.y*n.x;}int main(){    int n;    LL sum,num;    while(scanf("%d",&n)!=EOF)    {        sum=0;        memset(a,0,sizeof(a));        for(int i=0;i<n;i++)        {            scanf("%I64d %I64d",&a[i].x,&a[i].y);            sum+=a[i].y;        }        sort(a,a+n,cmp);        num=0;        for(int i=0;i<n;i++)        {           sum-=a[i].y;           num+=sum*(a[i].x*2);        }        printf("%I64d\n",num);    }    return 0;}`

Time: 2017-07-14