题意:给出n个括号,问是否能让值和为k,一个括号的值为这个括号里面有多少个完整的括号
思路:我们可以求出最大价值,即(1+2.....+(n-1)),如果他在某个地方不完整的括号,就看他有多少个剩余的,放在那个括号里,例如:
10 42 (1+2+3+4+5+6+7+8)=36,(((((((())))))))就不能添加第9个括号了,那剩下的6个,我们就可以在倒数第6个那加上括号,那剩下的6个就每个多加一个了,(((((((())()))))))
http://codeforces.com/contest/847/problem/C
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=200005; 5 6 7 int main(){ 8 ll n,m; 9 cin>>n>>m; 10 ll Max=n*(n-1)/2; 11 if(m>Max){ 12 cout<<"Impossible"<<endl;return 0; 13 } 14 ll sum=0,s=1; 15 int cnt; 16 for(int i=1;;i++){ 17 if(sum+i>m) { 18 cnt=m-sum;break; 19 } 20 sum+=i;s++; 21 } 22 23 for(int i=1;i<=s;i++){ 24 printf("("); 25 if(i==cnt) printf("()"); 26 } 27 for(int i=1;i<=s;i++) 28 printf(")"); 29 if(cnt) s++; 30 for(int i=1;i<=n-s;i++) 31 printf("()"); 32 cout<<endl; 33 }