IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 补提计划 Codeforces Round #608 (Div. 2) -> 正文阅读

[数据结构与算法]补提计划 Codeforces Round #608 (Div. 2)

VP过4题,感觉自己还是挺水的,D还是卡点过的,状态转移没想清楚就开写,结果导致debug麻了。回过头来一看,发现自己过的这几题都是挺简单的题,感觉自己还是需要加训

A

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int a,b,c,d,e,f;
    scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
    ll res=0;
    if(e>f)
    {
        res+=1ll*min(a,d)*e;
        d-=min(a,d);
        res+=1ll*min({b,c,d})*f;
    }
    else 
    {
        res+=1ll*min({b,c,d})*f;
        d-=min({b,c,d});
        res+=1ll*min(a,d)*e;
    }
    cout<<res;
}

B


#include<bits/stdc++.h>
using namespace std;
const int maxn=2e2+10;
char s[maxn];
int n;
vector<int> res;
void turn(int pos)
{
    if(s[pos]=='W')s[pos]='B';else s[pos]='W';
}
void get(char a)
{
    for(int i=1;i<=n;i++)
    {
        if(s[i]==a)
        {
            turn(i);turn(i+1);
            res.push_back(i);
        }
    }
}
int main()
{
    scanf("%d",&n);scanf("%s",s+1);
    int d1=0,d2=0;
    for(int i=1;i<=n;i++)if(s[i]=='W')d1++;else d2++;
    if((d1&1)&&(d2&1)){puts("-1");return 0;};
    if(d2&1)get('W');
    else get('B');
    cout<<res.size()<<endl;
    for(int i=0;i<res.size();i++)cout<<res[i]<<" ";
}

C


#include<bits/stdc++.h>
using namespace std;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int cnt[4];
int main()
{
    int n,sx,sy;scanf("%d%d%d",&n,&sx,&sy);
    while(n--)
    {
        int x,y;scanf("%d%d",&x,&y);
        x-=sx,y-=sy;
        if(x>0)cnt[0]++;
        else if(x<0)cnt[1]++;
        if(y>0)cnt[2]++;
        else if(y<0)cnt[3]++;
    }
    int mx=max({cnt[0],cnt[1],cnt[2],cnt[3]});
    for(int i=0;i<4;i++)
    {
        if(cnt[i]==mx)
        {
            printf("%d\n",cnt[i]);
            printf("%d %d",sx+dx[i],sy+dy[i]);
            return 0;
        }
    }
}

D

dp[i][j]表示到达第i个位置还剩下j个兵

很显然的发现,第i个城堡是否驻守,应该留到最后去选择。毕竟前面缺兵,很可能兵不够。所以我们只需要在最后一个j处建立能抵达i的边就好了

然后就是个简单的01背包

这里可以滚动数组,但显然没有必要

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e3+10;
const int N=5e3;
vector<int> son[maxn];
int dp[maxn][maxn];
typedef pair<int,int> pii;
pii p[maxn];
int a[maxn],b[maxn],c[maxn],e[maxn];
int main()
{
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){scanf("%d%d%d",&a[i],&b[i],&c[i]);}
    while(m--)
    {
        int u,v;
        scanf("%d%d",&u,&v);e[v]=max(e[v],u);
    }
    for(int i=1;i<=n;i++)
    {
        if(!e[i])son[i].push_back(i);
        else son[e[i]].push_back(i);
    }
    memset(dp,-1,sizeof(dp));
    dp[0][k]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=a[i];j<=N;j++)
        {
            if(dp[i-1][j]==-1)continue;
            dp[i][j+b[i]]=dp[i-1][j];
        }
        for(auto v:son[i])
        {
            for(int j=1;j<=N;j++)
           { if(dp[i][j]==-1)continue;
             dp[i][j-1]=max(dp[i][j-1],dp[i][j]+c[v]);
               
           }
        }
    }
    // cout<<dp[2][1]<<endl;
    int res=-1;
    for(int i=0;i<=N;i++)res=max(res,dp[n][i]);
    printf("%d\n",res);
}

E 二分终点记得特判L

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k;
ll check(ll x)
{
    ll ans=0,t=1;
    while(x<=n)
    {
        ans+=min(n-x+1,t);
        x<<=1;
        t<<=1;
    }
    return ans;
}
ll solve1()
{
    ll l=1,r=n/2,res=-1;
    while(l<r)
    {
        ll mid=l+r+1>>1;
        if(check(2*mid)+check(2*mid+1)>=k)l=mid,res=mid*2;
        else r=mid-1;
    }
    if(check(2*l)+check(2*l+1)>=k)res=max(res,r*2);
    return res;
}
ll solve2()
{
    ll l=1,r=(n+1)/2,res=-1;
    while(l<r)
    {
        ll mid=l+r+1>>1;
        if(check(2*mid-1)>=k)l=mid,res=mid*2-1;
        else r=mid-1;
    }
    if(check(2*l-1))res=max(2*l-1,res);
    return res;
}
int main()
{
    ll res=-1;
    scanf("%lld%lld",&n,&k);
    res=max(solve1(),res);
    res=max(solve2(),res);
    cout<<res;
}

当然,我注意到有人E题找到了某种性质,性质有空就去猜一下

他用的代码是这样的

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,s;
int solve(int n,int k){
	for (s=1;s<=k;s*=2) ;s/=2;
	return (n-k+s)/s;
}
signed main(){
	scanf("%lld %lld",&n,&k);
	printf("%lld\n",max(solve(n,k),solve(n,k+1)<<1));
	return 0;
} 

F

感觉这题给2700给高了

#include<bits/stdc++.h>
using namespace std;
int a1,a2,b1,b2,c1,c2;
int dabc,dab,dac,dbc,da,db,dc;
bool check()
{
    if(min({a1,b1,c1})+min({a2,b2,c2})<dabc)return false;
    if(a1+a2-da<dabc||b1+b2-db<dabc||c1+c2-dc<dabc)return false;
    return true;
}
void solve()
{
    scanf("%d%d%d",&a1,&b1,&c1);scanf("%d%d%d",&a2,&b2,&c2);
    scanf("%d%d%d%d%d%d%d",&dabc,&dab,&dac,&da,&dbc,&db,&dc);
    for(int tab=0,mx1=min({dab,a1,b1});tab<=mx1;tab++)
    {
        if(dab-tab>min({a2,b2}))continue;
        a1-=tab,b1-=tab;a2-=(dab-tab),b2-=(dab-tab);
        for(int tac=0,mx2=min({dac,a1,c1});tac<=mx2;tac++)
        {
            if(dac-tac>min({a2,c2}))continue;
            a1-=tac,c1-=tac;a2-=(dac-tac),c2-=(dac-tac);
            for(int tbc=0,mx3=min({dbc,b1,c1});tbc<=mx3;tbc++)
            {
                if(dbc-tbc>min({b2,c2}))continue;
                b1-=tbc,c1-=tbc;b2-=(dbc-tbc),c2-=(dbc-tbc);
                if(check())
                {
                    int fabc=min({a1,b1,c1,dabc});
                    a1-=fabc,b1-=fabc,c1-=fabc;
                    printf("%d %d %d %d ",fabc,tab,tac,min(a1,da));
                    printf("%d %d %d\n",tbc,min(b1,db),min(c1,dc));
                    return ;
                }
                b1+=tbc,c1+=tbc;b2+=(dbc-tbc),c2+=(dbc-tbc);
            }
            a1+=tac,c1+=tac;a2+=(dac-tac),c2+=(dac-tac);
        }
        a1+=tab,b1+=tab;a2+=(dab-tab),b2+=(dab-tab);
    }
    printf("-1\n");return ;
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        solve();
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:48:42  更:2022-03-24 00:49:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:53:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码