2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest, qualification stage (Online Mirror, ACM-ICPC Rules, Teams Preferred) C C. Sum of Nestings

题意:给出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 }

 

posted on 2017-09-20 18:51  hhhhx  阅读(185)  评论(0编辑  收藏  举报

导航