几个cf水题

1358C 1600
题意:在一个类似于三角形排列的二维数组(即[1,1]->[1,2]->[2,1]->[1,3]->[2,2]->[3,1]这样类似三角形的递增排列)一个起点sx,sy,和终点ex,ey,问你从起点到终点的路径和有多少种可能,且路径的方向只能往下或者往右,
思路:可以模拟一下,从一个点到另一个点路径有多种,而且其中有可能会有虽然然路径不同,但是路径和相同的情况,所以,可以想想路径的最大值和路径的最小值,然后判断在路径的最大值和最小值之间是否会存在遗漏,显然通过分析,是没有遗漏的,那么问题就来了,如何计算路径最大值和最小值的差值呢,如果模拟一下不难发现起点和终点的相对位置和差值有关,其余的都和差值无关,然后得到最后的关系式就ok了

int main(){
    IOS;
    int t;
    cin>>t;
    while(t--){
        ll a, b, c, d;
        cin>>a>>b>>c>>d;
        cout<<(c-a)*(d-b)+1<<endl;
    }
    return 0;
}

1352G 1600
题意:给你一棵树,n个结点,n-1条边,然后定义其中一个结点为特殊点(可以为叶子结点),Ashish和Ayush分别对这棵树进行操作,对这棵树减去叶子结点,也就是度为1的点,将与这个结点的边全部剪除。最先剪掉特殊点的人获胜。Ayush先剪
思路:我一开始看到这个题目的时候想到的还是拓扑排序。。没想到。。一样的是模拟一下,如果这个特殊结点就是叶子节点,那么肯定是Ayush获胜,如果这个特殊节点不是叶子结点,那么可以设想每个人的操作都是最优的,那么就肯定不会使得这个特殊结点变为叶子节点,除非是迫不得已,只能剪去一个叶子结点使得这个特殊结点变为叶子结点,所以到最后肯定是剩下两个结点,特殊节点和另外一个结点,之后的久很容易判断了,如果这个树的节点数为偶数那么Ayush获胜,反之Ashish获胜。

int main(){
    IOS;
    int t;
    cin>>t;
    while(t--){
        int n, k;
        cin>>n>>k;
        int flag = 0;
        for(int i = 0; i < n-1; i++){
            int x, y;
            cin>>x>>y;
            if(x==k||y==k){
                flag++;
            }
        }
        if(flag>=2){
            if(n%2==0){
                cout<<"Ayush"<<endl;
            }else cout<<"Ashish"<<endl;
        }
        else cout<<"Ayush"<<endl;
    }
    return 0;
}

1352G 1600
题意:给你一个数n,问你是否存在这么数组a包含1到n,且2<=|a[i]-a[i-1]|<=4,如果存在则打印出这个数组,如果不存在则打印-1
思路:这个题目是真的水,模拟一下,就先跳着来1,3,5 。。。然后在结尾的时候分类讨论,同时对n=4的时候另行分析,因为我假设的数组都是以1为开头。具体实现看代码吧

int main(){
    IOS;
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        if(n<4){
            cout<<"-1"<<endl;
            continue;
        }else if(n==4){
            cout<<"3 1 4 2"<<endl;
            continue;
        }
        for(int i = 1; i <= n; i+=2){
            cout<<i<<" ";
        }
        if(n%2==0){
            cout<<n-4<<" "<<n<<" "<<n-2<<" ";
            for(int i = n-6; i > 0; i-=2){
                cout<<i<<" ";
            }
        }
        else {
            cout<<n-3<<" "<<n-1<<" ";
            for(int i = n-5; i > 0; i-=2){
                cout<<i<<" ";
            }
        }
        cout<<endl;
    }
    return 0;
}

之后还有一个1700和两个1900的题要补题解/心塞.jpg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值