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 }
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 }
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 }
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 }
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 }

浙公网安备 33010602011771号