Codeforces Round #526 (Div. 2)

A. The Fair Nut and Elevator

模拟题 反正n小于101

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[101],n;
 4 int main()
 5 {
 6 
 7     cin>>n;
 8     for(int i=1;i<=n;i++)cin>>a[i];
 9     int ans=1e9,s;
10     for(int i=1;i<=n;i++)
11     {
12         s=0;
13         for(int j=1;j<=n;j++)s+=a[j]*(abs(i-j)+j+i-2)*2;
14         ans=min(s,ans);
15     }
16     cout<<ans;
17     return 0;
18 }
View Code

B. Kvass and the Fair Nut

二分找到最大的ans 满足 总和-n*ans>=s

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 long long s,sum,r,l,mid;
 5 int main()
 6 {
 7 
 8     cin>>n>>s;
 9     long long x;
10     r=2e9;
11     for(int i=1;i<=n;i++)cin>>x,sum+=x,r=min(r,x);
12     if(sum<s){cout<<"-1";return 0;}
13     l=0;r++;
14     while(l+1<r)
15     {
16         mid=(l+r)>>1;
17         if(sum-mid*n>=s)
18             l=mid;
19         else
20             r=mid;
21     }
22     cout<<l;
23     return 0;
24 }
View Code

C. The Fair Nut and String

忽略其他字符

变成aaaabaaabaa......

ans=(a1+1)*(a2+1)*(a3+1)...... -1

ai为第i段a的数量

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char a[100007];
 4 const long long mod=1e9+7;
 5 int main()
 6 {
 7     cin>>a;
 8     int i=0;
 9     long long ans=1,s=0;
10     while(i<strlen(a)&&a[i]!='a')i++;
11     while(i<strlen(a))
12     {
13         s=1;
14         while(i<strlen(a)&&a[i]!='b')
15         {
16             if(a[i]=='a')s++;
17             i++;
18         }
19         ans=(ans*s)%mod;
20         while(i<strlen(a)&&a[i]!='a')i++;
21     }
22     ans=(ans+mod-1)%mod;
23     cout<<ans;
24     return 0;
25 }
View Code

D. The Fair Nut and the Best Path

树形dp

dp[x]表示x为根子树中 以x为开头的最大值

x为根子树的答案为dp[x]和Wx-Cxs1-Cxs2+dp[s1]+dp[s2](s1,s2为x的子节点)的最大值

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=3e5+10;
 4 long long ans=0;
 5 long long dp[maxn];
 6 struct node
 7 {
 8     int v;
 9     long long w;
10 }q;
11 bool cmp(long long i,long long j)
12 {
13     return i>j;
14 }
15 vector<node> l[maxn];
16 int n;
17 int a[maxn];
18 void dfs(int x,int fa)
19 {
20     int i,v;
21     vector<long long> s;
22     dp[x]=a[x];
23     ans=max(dp[x],ans);
24     for(int i=0;i<l[x].size();i++)
25     if(l[x][i].v!=fa){
26         v=l[x][i].v;
27         dfs(v,x);
28         if(dp[v]>l[x][i].w)
29             s.push_back(dp[v]-l[x][i].w);
30     }
31     if(s.size()==0)return;
32     if(s.size()==1)
33     {
34         dp[x]+=s[0];
35         ans=max(ans,dp[x]);
36         return;
37     }
38     sort(s.begin(),s.end(),cmp);
39     dp[x]+=s[0];
40     ans=max(ans,dp[x]+s[1]);
41 }
42 int main()
43 {
44     scanf("%d",&n);
45     for(int i=1;i<=n;i++)
46         scanf("%d",&a[i]);
47     int x;
48     for(int i=1;i<n;i++)
49     {
50         scanf("%d%d%lld",&x,&q.v,&q.w);
51         l[x].push_back(q);
52         swap(x,q.v);
53         l[x].push_back(q);
54     }
55     dfs(1,0);
56     cout<<ans;
57     return 0;
58 }
View Code

E. The Fair Nut and Strings

k=1结果为n

设是s[x]为长度为x的前缀有多少个

当a[i]=b[i] s[x]=2*s[x-1]-1

当a[i]=a b[i]=b s[x]=2*s[x-1]

当a[i]=b b[i]=a s[x]=2*s[x-1]-2

ans=∑s[i]

注意和k取下min

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxs=5e5+10;
 4 char a[maxs],b[maxs];
 5 int main()
 6 {
 7     long long n,k;
 8     long long ans=0,s=1;
 9     scanf("%lld%lld",&n,&k);
10     scanf("%s%s",a,b);
11     if(k==1){printf("%d\n",n);return 0;}
12     for(int i=0;i<n;i++)
13     {
14         s*=2;
15         if(a[i]==b[i])s--;
16         else if(a[i]>b[i])s-=2;
17         s=min(s,k);
18         ans+=s;
19     }
20     printf("%lld\n",ans);
21     return 0;
22 }
View Code

 

posted @ 2018-12-13 21:47  hermit-lei  阅读(148)  评论(0)    收藏  举报