HDU 1274(集训比赛2B_D题)解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1274
-----------------------------------------------------------------------------------
题意:输入一个字符串,按题意所要求的进行展开
思路:看到这种具有多次类似操作的展开可以想到递归,从左向右读取字符,遇到(则递归,否则直接输出。递归函数是有返回值的,在不是直接输出字符串的情况,需要递归调用之前的展开次数。
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; int n;int m; const int MAXN =1e5+10; ll a[MAXN]; int far =0; ll sum; int jud(ll mid){ int man =0; ll s=0; for(int i=1;i<=far;i++){ s+=a[i]; while(s+i>=mid){ s-=mid-i; man++; } } if(s>0) man++; //printf("man:%d\n",man); if(man>m) return 1; else return 0; } ll proce(){ ll left =far+1; ll right =far+sum; ll mid =(left+right)/2; while(right>=left){ mid =(left+right)/2; //printf("left:%d right:%d mid:%d\n",left,right,mid); if(jud(mid)){ left =mid+1; }else{ right =mid-1; } } return left; } int main(void){ scanf("%d %d",&n,&m); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); if(a[i]!=0) far =i; sum+=a[i]; } ll ans = proce(); printf("%lld\n",ans); return 0; }

浙公网安备 33010602011771号