zoukankan      html  css  js  c++  java
  • 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
    ",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

    题意  一个特殊基因可以分成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
  • 相关阅读:
    ASP.Net GBK 解码
    windows默认共享的打开和关闭?
    NET导出Excel遇到的80070005错误的解决方法
    JavaScript(一)
    博客开通
    java知识学习05-数据类型、变量、标识符、类型转换
    java知识学习04-注释、关键字、常量
    java知识学习03-第一个程序
    【转】Git 冲突:Your local changes would be overwritten by merge. Commit, stash or revert them to proceed.
    idea如何在Git上将分支代码合并到主分支
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/10604737.html
Copyright © 2011-2022 走看看