码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #621 (Div. 1 + Div. 2) 题解

时间:2020-02-18 14:51:10      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:memset   +=   for   src   技术   lap   取整   else   注意   

A. Cow and Haybales

思路:

在任何时候,最理想的做法是将最近的一堆草垛从桩1移到左侧。 因此,每天,我们都可以从左到右遍历一堆桩,并将我们看到的第一个草垛移近。 如果某个时候所有干草捆都堆放在第1堆中,我们可以早点停下来

技术图片
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#include<iostream>
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<0||ch>9){if(ch==-)w=-1;ch=getchar();}
   while(ch>=0&&ch<=9) s=s*10+ch-0,ch=getchar();
   return s*w;
}
const int manx=1e5+5;
ll a[manx];
int main()
{
    ll kk=read();
    while(kk--)
    {
        ll n,m;
        scanf("%lld%lld",&n,&m);
        for(int i=1;i<=n;i++) cin>>a[i];
        ll kkk=0;
        for(int i=2;i<=n;i++){
            if(!a[i]) continue;
            if(m>=(i-1)){
                ll res=m/(i-1);
                if(a[i]<res) m-=a[i]*(i-1),kkk+=a[i];
                else m%=(i-1),kkk+=res;
            }
            else break;
        }
        cout<<a[1]+kkk<<endl;
    }

    return 0;
}
View Code

B. Cow and Friend

思路:

如果最喜欢的数字里包含x那么答案就为1

否则,设能跳的最远距离为max,如果max大于x的话那么答案就为2,如果小于x的话答案就为(x/max)向上取整

 

技术图片
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
 using namespace std;
 typedef long long ll;
 const int maxn=1e5+10;
 int a[maxn];
 int main()
 {
     int yy;
     cin>>yy;
     while(yy--){
         int n,x;
         scanf("%d%d",&n,&x);
         int k=0,fla=0;
         for(int i=1;i<=n;i++){
             scanf("%d",&a[i]);
             if(a[i]<=x){
                 k=max(a[i],k);
             }
            if(a[i]>x){
                fla=1;
            }
         }
        if(fla&&k!=x){
            cout<<2<<endl;
            continue;
        } 
        if(!(x%k)) cout<<x/k<<endl;
        else cout<<(x/k+1)<<endl; 
     }
 }
View Code

 

C. Cow and Message

思路:

由于有等差数列这个限制,所以两个以上字母的组合是肯定没有两个字母组合更有,因此我们只要枚举26*26个字母的组合看看哪种组合的出现次数最多即可,注意两个相同数字的组合也有可能是最大的

技术图片
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define maxn 100010
ll letter[maxn][30],vis[30][30],hz[30]={0},cnt[30]={0};
int main()
{
    memset(vis,0, sizeof(vis));
    memset(letter,0, sizeof(letter));
    string s;
    cin>>s;
    int n=s.length();
    for (int i = 0; i <n ; ++i) {
        if(i>0){
            for (int j = 0; j <26 ; ++j) {
                letter[i][j]=letter[i-1][j];
            }
        }
        letter[i][s[i]-a]++;
        cnt[s[i]-a]++;
    }
    for (int k = 0; k <n-1 ; ++k) {
        for (int i = 0; i <26 ; ++i) {
            hz[i]=letter[n-1][i]-letter[k][i];
            vis[s[k]-a][i]+=hz[i];
        }
    }
    ll kk=0;
    for (int l = 0; l <26 ; ++l) {
        for (int i = 0; i <26 ; ++i) {
            if(vis[l][i]>kk) kk=vis[l][i];
        }
    }
    for (int m = 0; m <26 ; ++m) {
        if(cnt[m]>kk) kk=cnt[m];
    }
    cout<<kk<<endl;
    return 0;
}
View Code

 

Codeforces Round #621 (Div. 1 + Div. 2) 题解

标签:memset   +=   for   src   技术   lap   取整   else   注意   

原文地址:https://www.cnblogs.com/overrate-wsj/p/12325956.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!