暑期培训1期4

T1 瓦卡吃瓜瓜 (模拟)在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
1
5 5
AWaDa!

if一下就完事了因为都是两个瓜的一局,所以第一个数是偶数,那么-1,第二个是奇数–1

#include<bits/stdc++.h>
using namespace std;
int a,b;
int t;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&a,&b);
        if(a%2==0)a--;if(b%2==1)b--; //比自己最多吃的那局的瓜多出一,没有用
        if(a>b)puts("AWaDa!"); 
        else puts("AKTang!");
    }
    return 0;
 } 


T2 烤乐滋炸桥(贪心)

在这里插入图片描述
在这里插入图片描述
读完题目可以发现,题目中的c没有可以忽略。然后把题目简化就是看看没有重叠的有几个桥。将桥尾从小到大排序,如果接下来的桥头大于桥尾,那么不重叠,炸弹++

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int l;
    int r;
}a[150000];
bool cmp(node x,node y)//从小到大
{
    if(x.r==y.r)return x.l<y.r;
    return x.r<y.r;
}
int main()
{
    int n;cin>>n;
    int q,ans=0;
    for(int i=1;i<=n;i++) cin>>a[i].l>>a[i].r>>q;
    sort(a+1,a+1+n,cmp);
    q=0;
    for(int i=1;i<=n;i++)
    if(a[i].l>q)q=a[i].r,ans++;//没有重叠
    cout<<ans;
    return 0;
}


T3不一样的审美(dp)

题目描述
由于 xz 长得实在是太帅了,英俊潇洒,风流倜傥,人见人爱,花见花开, 车见车载。有一群 MM 排队看 xz。每个 MM 都有自己独特的风格,由于 xz 有着一 颗包容的心,所以,什么风格的 MM 他都喜欢…… 但,xz 有一个特别的要求,他不希望总是看到风格都差不多的 MM,更加 特别的是,如果两个 MM 风格完全一样,xz 不会有任何意见。 现在,xz 希望从去看他的 MM 中,去掉一些 MM,从而使得相邻 2 个 MM 的风 格值的差(绝对值)不为 1。自然地,xz 希望去掉的 MM 越少越好。

输入
第一行一个整数 N;
第 2~N+1 行,每行一个整数 Ci,表示第 i 个 MM 的风格值

输出
输出一个数,表示最少要去掉的 MM 数。

设立状态dp[i]表示前I个mm最多能留几个mm。第二重循环从第一个mm开始,到i-1个mm如果两个mm的abs值不为一,第i个mm就可以重第j个mm答案加1推过来

#include<bits/stdc++.h>
using namespace std;
int n,a[1500],dp[1500],b[1500];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i],dp[i]=1;
     
 
    for(int i=1;i<=n;i++)
    for(int j=1;j<i;j++)
    if(abs(a[i]-a[j])!=1)
    dp[i]=max(dp[i],dp[j]+1);//状态转移
     
    cout<<n-dp[n];
    return 0;
}

T4 瓦卡的旅行(DFS)

在这里插入图片描述

在这里插入图片描述

两遍dfs,第一遍从一开始找到与1连的路的最大知道的点,然后从找到的点开始,再跑一边,连一遍还没有连过的点

#include<bits/stdc++.h>
#define maxn 150000 
using namespace std;
int a[maxn],head[maxn],tot,n,m,fa[maxn],ans[maxn];
struct node
{
    int u;
    int v;
}edge[maxn];
void add(int x,int y)
{
    ++tot;
    edge[tot].u=head[x];
    edge[tot].v=y;
    head[x]=tot;
}
void dfs(int x)
{
    fa[x]=x;
    for(int i=head[x];i;i=edge[i].u)
    {
        if(fa[edge[i].v]==0)//有没有来过
        {
            dfs(edge[i].v);
            if(ans[edge[i].v]>ans[x]){
                ans[x]=ans[edge[i].v];//更新最大ans
                fa[x]=fa[edge[i].v];
            }
        }
    }
    ans[x]+=a[x];
}
int read()
{
    int x=0;char c=getchar();
    while(c>'9'||c<'0')c=getchar();
    while(c<='9'&&c>='0')
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return x;
}
int main()
{
    n=read();m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    for(int i=1;i<=m;i++)
    {
        int x,y;x=read();y=read();
        add(x,y);
        add(y,x);
    }
     
    dfs(1);
    int q=fa[1];找到那个点,从那里开始
    memset(fa,0,sizeof(fa));
    memset(ans,0,sizeof(ans));
     
    dfs(q);
    cout<<ans[q];
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值