暑假集训7月16日

补题

H

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int pos[55];
int b[N];
signed main()
{
    int n;
    cin>>n;
    for (int i=1;i<=n;i++)
        cin>>a[i];
    for (int i=n;i>=1;i--)
    {
        int mi=0x3f3f3f3f;
        bool flag=1;
        pos[a[i]]=i;
        for (int j=a[i]+1;j<=50;j++)
        {
            if (mi>pos[j]&&pos[j])
            {
                 flag=0;
                 mi=pos[j];
                 b[i]=j;
            }
        }
        if (flag)b[i]=-1;
    }
    for (int i=1;i<=n;i++)cout<<b[i]<<' ';
    cout<<"\n";
    return 0;
}

E

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
const int N = 1e5+19;

char ch[N];
int a[33];

bool cmp(int a,int b)
{
    return a>b;
}

signed main()
{
    scanf("%s", &ch);
    int i,j;
    int x;
    for(i = 0; ch[i]; i++)
    {
        x = ch[i]-'a';
        a[x] ++;
    }

    sort(a, a+28 ,cmp);

    int fg = 2;
    long long int mi = 10000, sum;
    for(int i = 2; i<=a[0]; i++)
    {
        sum = 0;
        for(j = 0 ; a[j]>0; j++)
        {
            sum += (long long int )(a[j]%i) * a[j];
        }

        if(sum<mi)
        {
            mi = sum;
            fg = i;
        }
    }
    printf("%d",fg);
    return 0;
}

C 双向边记得开两倍

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10,M=2e5+10;
bool cnt1[30],cnt2[30];
int cal(string a,string b)
{
    memset(cnt1,0,sizeof cnt1);
    memset(cnt2,0,sizeof cnt2);
    for (int i=0; a[i]; i++)
    {
        if (a[i]>='A'&&a[i]<='Z')
            a[i]+=32;
        cnt1[a[i]-'a']=1;
    }
    for (int i=0; b[i]; i++)
    {
        if (b[i]>='A'&&b[i]<='Z')
            b[i]+=32;
        cnt2[b[i]-'a']=1;
    }
    int num=0;
    for (int i=0; i<26; i++)
    {
        if (cnt1[i]&&cnt2[i])
            num++;
    }
    return num;
}
string str[N];
int n,m,en,enn;
int h[N],e[M],ne[M],w[M],idx;
bool st[N];
void add(int u,int v,int k)
{
    e[idx]=v,ne[idx]=h[u],w[idx]=k,h[u]=idx++;
}
int dist[N];
int spfa()
{
    memset(dist,0x3f,sizeof dist);
    dist[en]=0;
    queue<int>q;
    q.push(en);
    st[en]=1;
    while (q.size())
    {
        int t=q.front();
        q.pop();
        st[t]=0;
        for (int i=h[t]; i!=-1; i=ne[i])
        {
            int j=e[i];
            if (dist[j]>dist[t]+w[i])
            {
                dist[j]=dist[t]+w[i];
                if (!st[j])
                {
                    st[j]=1;
                    q.push(j);
                }
            }
        }
    }
    return dist[enn];
}
signed main()
{
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    for (int i=1; i<=n; i++)
        cin>>str[i];
    for (int i=0; i<m; i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        int num=cal(str[u],str[v]);
        add(u,v,num);
        add(v,u,num);
    }
    scanf("%d%d",&en,&enn);
    printf("%d\n",spfa());
    return 0;
}

 F

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll a[N];
signed main()
{
    int n;
    cin>>n;
    for (int i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+1+n);
    int m;
    cin>>m;
    while (m--)
    {
        ll x;
        cin>>x;
        int l=1,r=n;
        while (l<r)
        {
            int mid=l+r>>1;
            if (a[mid]>=x)
                r=mid;
            else l=mid+1;
        }
        if (a[l]<x)printf("Dr. Samer cannot take any offer :(.\n");
        else
        cout<<a[l]<<"\n";
    }
    return 0;
}

 B

 

 

/*
 2 把一个字符串分成若干段,每一段里面的字符不能重复,问有多少种分法
 3 动态规划,定义dp 表示字符串前n个字母的分法种数,先预处理字符串,对于每个字符,
 4 计算出以这个字符为结尾的无重复字符的一段最长的长度,第i个字符对应的长度记为f[i]
 5 然后可以得出递推式:
 6 dp[0]=1;
 7 dp[i]=dp[i-j] (1<=j<=f[i])
 8 */
 9 #include <bits/stdc++.h>
10 using namespace std;
11 int dp[10005];
12 int f[10005];
13 bool vis[10];
14 const int mod=1e9+7;
15 int main()
16 {
17     string s;
18     int n;
19     cin>>n>>s;
20     memset(dp,0,sizeof(dp));
21     memset(f,0,sizeof(f));
22     for(int i=0;i<n;i++)
23     {
24         memset(vis,0,sizeof(vis));
25         int cnt=0;
26         for(int j=i;j>=0;j--)
27         {
28             if(vis[s[j]-'0'])
29                 break;
30             cnt++;
31             vis[s[j]-'0']=1;
32         }
33         f[i+1]=cnt;
34     }
35     dp[0]=1;
36     for(int i=1;i<=n;i++)
37     {
38         int sum=0;
39         for(int j=1;j<=f[i];j++)
40         {
41             sum=(sum+dp[i-j])%mod;
42         }
43         dp[i]=sum;
44     }
45     cout<<dp[n]%mod<<endl;
46 }

 

posted @ 2022-07-16 20:00  好腻友Π  阅读(26)  评论(0)    收藏  举报