Codeforces Round #765 (Div. 2)

地址

A.题意:给定n个数然后转换成m位的二进制数,然后找出一个最小的数使这个数和每个数的二进制位上不同位的位数最小

思路:遍历m位,1多则ans该位为1,否则为0

复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e2 + 5;
int one[N];
int zero[N];
int main()
{

    int T;
    cin >> T;
    while (T--)
    {
        memset(one, 0, sizeof one);
        memset(zero, 0, sizeof zero);
        int n, l;
        cin >> n >> l;
        int ans = 0;
        for (int i = 0; i < n; i++)
        {
            int t;
            cin >> t;
            for (int j = 0; j <= 30; j++)
            {
                if ((t >> j) & 1)
                {
                    one[j]++;
                }
                else
                {
                    zero[j]++;
                }
            }
        }
        for (int i = 0; i < l; i++)
        {
            if (one[i] > zero[i])
            {
                ans += (1 << i);
            }
        }
        cout << ans << endl;
    }
    return 0;
}
View Code
复制代码

 B.题意:在一串数字中,找两个等长的连续子串(不能起始下标一致),如果无法找到则输出-1,能则输出最大长度.

思路:设两个相同的数字先后出现的下标分别为a,b那么他们之间的长度为n-b+a;

复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 150000+10;
int a[N];

int vis[N];
int main()
{

    int T;
    cin >> T;

    while (T--)
    {
        int f = 0;
        int n;
        cin >> n;
        int ans = -1;
        memset(vis, -1, sizeof(vis));
        memset(a, 0, sizeof(a));
        for (int i = 0; i < n; i++)
        {
            cin >> a[i];
            if (vis[a[i]]!=-1)
            {
                int b = vis[a[i]];
                ans = max(ans, n + b - i);
            }
            vis[a[i]] = i;
        }
        cout << ans << endl;
    }
    return 0;
}
View Code
复制代码

 C.题意:长为l的直线距离,一开始有n个路牌,路牌上的值乘以下一段的长度就是下一段的时间,现在最多可以移走k个路牌,问从0走到l的最小时间

思路:dp[i][j]表示到第i个路牌移走了j个路牌,枚举小于i的所有站点j,拿走j到i之间所有的车牌(j到i之间的路牌个数为j-i-1),可以实现状态的全覆盖,需要判断可拿走车牌的数量k要大于i-j-1

状态转移方程:f[i][k]=min(f[i][k],f[j][k-(i-j-1)]+v[j]*(d[i]-d[j]))

复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 510;
int n, l, m;
int d[N];
int v[N];
int dp[N][N];

int main()
{
    memset(dp, 0x3f, sizeof dp);
    cin >> n >> l >> m;
    for (int i = 1; i <= n; i++)
        cin >> d[i];
    for (int i = 1; i <= n; i++)
        cin >> v[i];
    n++;
    d[n] = l;
    for (int i = 0; i <= m; i++)

    {
        dp[1][i] = 0;//第一个路牌不能动
    }
    for (int i = 2; i <= n; i++)
    {
        for (int j = 1; j < i; j++)
        {
            for (int k = i - j - 1; k <= m; k++)
            {
                dp[i][k]=min(dp[i][k],dp[j][k-(i-j-1)]+v[j]*(d[i]-d[j]));
            }
        }
    }
    cout<<dp[n][m]<<endl;

    return 0;
}
View Code
复制代码

 

posted @   blakee  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
点击右上角即可分享
微信分享提示