题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
Hdu1003 Max Sum
#include <iostream> using namespace std; const int sd = 1 << (sizeof(int)* 8-1); int main (){ int T,N; cin>>T; int maxSum ,end , begin , newbegin , curSum; int k=1; while ( k<=T ) { curSum = end = begin = newbegin = 0; maxSum = sd; cin>>N; int a [100010]; for ( int i=0; i<N; i++ ) cin>>a[i]; cout<<"Case "<<k<<": "; for ( int i=0; i<N; i++ ) { curSum += a[i]; if ( curSum > maxSum ) { maxSum = curSum; end = i; begin = newbegin; } if ( curSum < 0 ) { curSum = 0; newbegin = i+1; } } cout<<maxSum<<" "<<begin+1<<" "<<end+1; if ( k==T ) cout<<endl; else cout<<endl<<endl; k++; } }
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025
Hdu 1025 Constructing Roads In JGShining's Kingdom
//输入数对p,r,输出最大对数,使得二部图中没有两条相交线 //没有相交线的情况line[i].p<line[i+1].p时,有line[i].r<line[i+1].r,反之亦然 //将line[].p从小到大排序,找出line[].r的LIS //由题意可知,同一个rich不会给多个poor提供resources //最长递增序列O(nlgn)算法(本质上也是动态规划) //利用一个数组b[i]来储存长度为i的最小末尾,d[maxn]为给出的数组,len为当前已求得的最大长度,i为当前元素下标 //若存在max(b[k])<d[i](从len逆序寻找k)则b[k+1]=d[i] //对于查找k,使得max(b[k])<d[i],可以逆序寻找,也可以采用二分法查找 //因为b[k]一定是一个已排序的数组 #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn=500005; struct node{ int p,r; }line[maxn]; bool cmp(node l1,node l2){ return l1.p<l2.p; } int n,len; int b[maxn]; int binsearc(int d,int len){//在长度为len的b数组中查找k int begin=1,end=len,mid=(begin+end)/2; while(begin<=end)//相当注意!!!!! { if(d>b[mid]) begin=mid+1; else if(d<b[mid]) end=mid-1; mid=(begin+end)/2; } return end;//可证明任何情况总能找出小于d的最大值 } int main(){ int cs=1; while(cin>>n){ memset(b,0,sizeof(b)); for(int i=1;i<=n;i++) cin>>line[i].p>>line[i].r; sort(line+1,line+n+1,cmp); len=0; for(int i=1;i<=n;i++) { int k=binsearc(line[i].r,len); if(k==len) len++; b[k+1]=line[i].r; } if(len<=1) cout<<"Case "<<cs++<<": My king, at most "<<len<<" road can be built. "; else cout<<"Case "<<cs++<<": My king, at most "<<len<<" roads can be built. "; } return 0; }