Educational Codeforces Round 60 (Rated for Div. 2)

A. Best Subsegment

题意 找 连续区间的平均值  满足最大情况下的最长长度

思路:就是看有几个连续的最大值  

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=    1e5+4;
 4 int a[maxn];
 5 int main(){
 6 int n;
 7 scanf("%d",&n);
 8 int maxnum=0;
 9 for(int i=0;i<n;i++)scanf("%d",&a[i]),maxnum=max(maxnum,a[i]);
10 int ans=1;
11 int temp=1;
12 for(int i=0;i<n;i++){
13 if(maxnum==a[i]&&i+1<n&&a[i]==a[i+1])temp++;
14 else ans=max(temp,ans),temp=1;
15 }
16 printf("%d",ans);
17 return 0;
18 }
View Code

B. Emotes

题意: n个数字 (正)  每个可以用任意次   一共m次   一个数字不能用超过连续k次  问m次 用的数字的和的最大值是多少

思路:直接找最大和次大  最大k次+次大1次 循环 最后处理一下余数即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=2e5+5;
 4 int a[maxn];
 5 int main(){
 6     int  n,m,k;
 7     scanf("%d%d%d",&n,&m,&k);
 8     for(int i=0;i<n;i++){
 9         scanf("%d",&a[i]);
10     }
11     sort(a,a+n);
12     long long ans=0;
13     int first=a[n-1],second=a[n-2];
14     ans=1ll*m/(k+1)*(1ll*first*k+second);
15     m%=(k+1);
16     ans+=1ll*m*first;
17     printf("%I64d\n",ans);
18 
19 return 0;
20 }
View Code

C. Magic Ship

题意:给出n个风向  风是循环运作的 并且给出起点和终点(二维)问可否到达终点

思路:将x y分解  对风求前缀和 二分找步数  看是否满足题意  这里记得二分范围要大 1e18 不然就会gg(虽然过了 但是我总感觉有点怪怪的好像能出数据hack 可能是有完备性证明的,只是我太菜不会证吧。。)

 1 #include<bits/stdc++.h>
 2 #define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;i++)
 3 #define MS(arr,arr_value) memset(arr,arr_value,sizeof(arr)) 
 4 #define F first 
 5 #define S second
 6 #define pii pair<int ,int >
 7 #define mkp make_pair
 8 #define pb push_back
 9 using namespace std;
10 const long long  inf=1e18;
11 typedef long long ll;
12 const int maxn=1e5+6;
13 map<char,pii>mp;
14 ll sumx[maxn],sumy[maxn];
15 char s[maxn];
16 void init(){
17     mp['U']={0,1};mp['D']={0,-1};mp['L']={-1,0};mp['R']={1,0};
18 }
19 int n;
20 ll X1,Y1,X2,Y2;
21 bool check(ll mid){
22 ll q=mid/n,r=mid%n;
23 ll nx=X1+sumx[n]*q+sumx[r];
24 ll ny=Y1+sumy[n]*q+sumy[r];
25 return (abs(nx-X2)+abs(ny-Y2))<=mid;
26 }
27 int main(){
28     init();
29     scanf("%lld%lld%lld%lld",&X1,&Y1,&X2,&Y2);
30     scanf("%d",&n);
31     scanf("%s",s+1);
32     FOR(i,1,n){
33         sumy[i]=sumy[i-1]+mp[s[i]].S;
34         sumx[i]=sumx[i-1]+mp[s[i]].F;
35     }
36     ll l=0,r=inf;
37     ll ans=inf;
38     while(l<=r){
39         ll mid=l+r>>1;
40         if(check(mid))ans=mid,r=mid-1;
41         else l=mid+1;
42     }
43     if(ans!=inf)cout<<ans<<endl;
44     else cout<<-1<<endl;
45 
46     
47 return 0;
48 }
View Code

D. Magic Gems

扫描二维码关注公众号,回复: 5671861 查看本文章

题意  一个特殊基因可以分成m个普通基因  问刚好n个基因有多少种组成方式   1<=n<=1e18  2<=m<=100

思路:看这数据范围 这题目就一股浓浓的矩阵快速幂的味道  直接列出转移式 构造矩阵  dp[n]=dp[n-1]+dp[n-m];

(1....10) 大概就这意思吧 然后直接套矩阵就行了   (写的时候傻逼用int读long long) m*m的矩阵   

(1.......0)
(01......0)

(001......0)

.....

 1 #include<bits/stdc++.h>
 2 #define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;i++)
 3 #define MS(arr,arr_value) memset(arr,arr_value,sizeof(arr)) 
 4 #define F first 
 5 #define S second
 6 #define pii pair<int ,int >
 7 #define mkp make_pair
 8 #define pb push_back
 9 using namespace std;
10 const long long  inf=1e18;
11 typedef long long ll;
12 const int mod=1e9+7;
13 long long  n,m;
14 struct mat{
15 ll m[105][105];
16     mat(){
17         MS(m,0);
18     }
19 };
20 mat Mul(mat a,mat b,int n){
21     mat res;
22     int i,j,k;
23     for( i=1;i<=n;i++){
24         for( j=1;j<=n;j++){
25             res.m[i][j]=0;
26             for(k=1;k<=n;k++){
27                 res.m[i][j]=(res.m[i][j]+(a.m[i][k]*b.m[k][j])%mod+mod)%mod;
28             }
29         }
30     }
31     return res;
32 }
33 mat fpow(mat a,ll b,int n){
34     mat ans;
35     for(int i=1;i<=n;i++)ans.m[i][i]=1;
36     while(b){
37         if(b&1)ans=Mul(ans,a,n);
38         a=Mul(a,a,n);
39         b>>=1;
40     }
41     return ans;
42 }
43 const int maxn=1e5+6;
44 int dp[200];
45 int main(){
46     scanf("%lld%lld",&n,&m);
47     if(n<=m){
48         if(n==m)cout<<2<<endl;
49         else 
50         cout<<1<<endl;
51         return 0;
52     }
53     dp[0]=1;
54   for(int i=1;i<m;i++)dp[i]=1;
55   dp[m]=dp[0]+dp[m-1];
56     mat d;
57     d.m[1][1]=1;d.m[1][m]=1;
58     for(int i=2;i<=m+1;i++)d.m[i][i-1]=1;
59     mat e;
60     for(int i=1;i<=m+1;i++){
61         e.m[m+2-i][1]=dp[i-1];
62     }
63   /*  for(int i=1;i<=m+1;i++){
64         cout<<e.m[i][1]<<endl;
65     }
66    for(int i=1;i<=m+1;i++){
67         for(int j=1;j<=m+1;j++){
68             cout<<d.m[i][j]<<" "; 
69         }
70         cout<<endl;
71     }
72 */
73 
74     d=fpow(d,n-m,m+1);
75     d=Mul(d,e,m+1);
76     cout<<(d.m[1][1])%mod<<endl;
77 
78     return 0;
79 }
View Code

猜你喜欢

转载自www.cnblogs.com/ttttttttrx/p/10604737.html