2024csp—J练习赛1补题报告———————————S12679

        一.题目报告

比赛中全部0分,赛后1,2,4题AC

        二.赛中概况

T1.三角形分割

用了普通判断,0分

T2.魔法塔

没排序,0分

T3.数字加倍

用了暴力 0分

T4.不合法字符串

想了很久,没想出来,0分

        三.解题报告

T1.比赛时0分,比赛后100分

题目描述

小可是一名年轻有为的建筑师,他在一次勘测任务中遇到了一个有趣的问题。他来到了一个二维平面上的一个面积不为零的三角形,三角形的三个顶点分别是A、B、C。 小可想要判断是否能够在这个三角形上画一条水平或竖直的线,将这个三角形划分为两个面积不为零的三角形。 但是小可不太会写代码,请你帮助小可,使用代码实现这个功能。

输入描述

第一行:输入一个正整数 t ,表示多组测试样例的数量。

对于每组测试样例,在单独的一行中输入6个整数,�1,�1,�2,�2,�3,�3x​1​​,y​1​​,x​2​​,y​2​​,x​3​​,y​3​​,(��,��)(x​i​​,y​i​​)表示三个点的坐标。

输出描述

对于每组测试样例,如果能用一条水平或竖直的线,将这个三角形划分为两个面积不为零的三角形,则输出YES,否则输出NO

输入样例

 
  1. 4
  2. 4 7 6 8 3 5
  3. 4 5 4 7 6 8
  4. 5 8 1 8 2 5
  5. 3 6 6 6 6 3

输出样例

 
  1. YES
  2. YES
  3. YES
  4. NO

数据描述

对于100%的数据:1≤t≤10​4​​,1≤x,y≤10​8​​

题目解析

若横线上和竖线上都有相等的数,输出NO,否则输出YES

AC代码:#include<bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    for(int i=1;i<=t;i++){
        int a,b,c,d,e,f;
        cin>>a>>b>>c>>d>>e>>f;
        int g=0;
        
        if((a==c||a==e||c==e)&&(b==d||b==f||d==f)){
            cout<<"NO"<<endl;
        }else cout<<"YES"<<endl;
    }
    return 0;
}

T2.比赛时0分,比赛后100分

题目描述

在一个小镇上,有一座魔法塔。这座塔里有n个魔法石,每个魔法石都有一个特定的能量值。小可是一个年轻的魔法师,他梦想成为最强大的魔法师。为了实现他的梦想,他必须通过一系列的挑战来提升自己的魔法能力。

挑战的规则是这样的:在每一次挑战中,小可可以选择两个魔法石,其中一个魔法石的能量值比另一个魔法石高。然后,他可以将能量值高的魔法石的能量减少1,并将能量值低的魔法石的能量增加1。小可可以进行任意多次的挑战操作。注意,魔法石的顺序不可以改变,且能量不能小于0。

小可非常聪明,他意识到,通过巧妙地选择挑战操作,他可以使得某个魔法石的能量值变得非常高。他想知道,在经过任意多次的挑战操作后,能够使得第一个魔法石的能量值最高,请问这个最高的能量值是多少。

小可向你寻求帮助,希望你能够计算出能够达到的最高能量值。你能帮助小可解决这个问题吗?

输入描述

第1行:输入一个正整数 t ,表示多组测试样例的组数。

​ 对于每组测试样例:

​ 第1行:输入一个正整数 n ,表示有 n 个魔法石。

​ 第2行:输入 n 个正整数,表示魔法石的初始能量值 �[�]a[i]。

输出描述

对于每组测试样例,输出经过任意次操作后,第一个魔法石能达到的最高能量值。

输入样例

 
  1. 4
  2. 3
  3. 1 2 3
  4. 3
  5. 1 2 2
  6. 2
  7. 1 1000000000
  8. 10
  9. 3 8 6 7 4 1 2 4 10 1

输出样例

 
  1. 3
  2. 2
  3. 500000001
  4. 9

数据描述

对于25%的数据:1≤t≤20,1≤n≤100,1≤a[i]≤103

对于100%的数据:1≤t≤20,1≤n≤104,1≤a[i]≤109

解析:

我们发现,使得 a[1] 最大,仅需使 a[1] 与更大的数进行操作,因为不管如何操作,数列总和不变,故 不需要非 a[1] 的二数进行操作。
经过操作,使 a[1] = (a[1] + a[i] )/2 时,二数最平均,故此时最大,同时,为了使 a[1] 与尽可能多的 数操作,应从小到大进行操作,故需先排序
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
    long long t,i,j,q,ma=-1;
    cin>>t;
    for(i=1;i<=t;i++){
        long long n,a[10010];
        cin>>n;
        ma=-1;
        for(j=1;j<=n;j++){
            cin>>a[j];
        }
        sort(a+2,a+n+1);
        for(int j=2;j<=n;j++){
            if(a[1]<a[j])a[1]=(a[1]+a[j]+1)/2;
        }
        cout<<a[1]<<endl;
    }
    return 0;
}
T3,T4没AC,所以没有AC代码,下面写我对这两道题的理解
T3:

题目描述

小可是一个数学天才,他喜欢研究数学问题。有一天,他遇到了一个有趣的问题。

问题是这样的:给定两个正整数n和x,小可需要对x进行一系列操作,使得x的位数与n相等,并且操作次数最少。每次操作,小可需要从x的十进制表示中截取一位数字y,然后将y与x相乘得到x’。例如,如果x=123,而小可截取的数字是2,则x’ = 123 * 2 = 246,之后令 x = x’ 。

输入描述

输入两个数字n 和 x ,表述如题

输出描述

输出操作次数的最小值,如果不可能,则输出-1。

我认为这道题可以用暴力,在练习赛中用了暴力求解,算例通过,没有得分

题中暴力算法代码(0分):

#include<bits/stdc++.h>
using namespace std;
int main(){
    union long long n,x;
    cin>>n>>x;
    union long long q=x,a=pow(10,n-1),b=pow(10,n)-1;
    int f=1;
    while(q){
        if(q%10!=1)f=0;
        q/=10;
    }
    if(f==1){
        cout<<-1;
        return 0;
    }
    union long long cnt=0,ma;
    while(x<a){
        q=x,ma=-1;
        cnt++;
        while(q){
            ma=max(ma,q%10);
            q/=10;
        }
        x=x*ma;
    }
    if(x<=b){
        cout<<cnt;
        return 0;
    }
    if(x>b){
        cout<<-1;
        return 0;
    }
    return 0;
}

看题解后发现需要用宽搜,因为我没学宽搜,所以在是没法解决这道题

T4:

题目描述

小可是一名小说审核员,他的工作是看小说,然后把小说中不合法字符串和谐掉。

现在给出若干个不合法的字符串 s[i],和一篇小说 str ,小可需要把 str 中的不合法字符串用 *和谐掉。当然小可是一个很聪明的审核员,他会用最少的 * 和谐字符串。

比如:

​ 有三个不合法字符串:abcaba 。str=abcd

​ 他会只和谐a,使得str=*bcd,这样小说中就没了不合法字符串。

请输出和谐之后的小说。

输入描述

第一行:输入一个整数 T 表示测试用例数。

​ 对于每组测试样例:

​ 第一行:输入一个正整数 n ,表示不合法字符串的数量。

​ 接下来n行:每行输入一个字符串,表示不合法字符串。

​ 接下来一行:输入一个字符串,表示小说。

输出描述

输出和谐之后的小说

比赛中这道题我使用暴力的,结果0分,因为没想到一个字符可以去掉多个不合法字符串

看了题解之后,AC了

AC代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        vector<string> ve(n);
        for(auto &i: ve)cin>>i;
        string s;
        cin>>s;
        n=s.size();
        s=" "+s+" ";
        for(int i=1;i<=n;i++){
            for(auto &j:ve){
                if(i-int(j.size())<0)continue;
                if(s.substr(i-j.size()+1,j.size())==j)s[i]='*';}}
        cout<<s.substr(1,n)<<endl;}
    return 0;}

        四.总结

下次我一定要在会的题上都得分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值