首页 > 其他分享 >cf构造题专练+at小题两道

cf构造题专练+at小题两道

时间:2022-10-27 21:46:09浏览次数:50  
标签:cout int cf long solved 数组 小题 专练 define

cf:

1.https://codeforces.com/problemset/problem/1739/B

题目大意:

给定一个数组B,令数组B[i]=abs(a[i]-a[i-1)),你的任务是尽可能的还原A数组,输出任意满足条件的构造数组

做法:

利用题目给出的条件构造数组即可,首先肯定是a[1]=b[1]并且在此之后,根据差分公式可得,a[i]是大于s[i-1]的,并且a[i]还必须是非负数

参考代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 5 const int N=110;
 6 int t;
 7 int n;
 8 int a[N];
 9 int s[N];
10 void solved()
11 {
12     /*c.clear();
13     cin>>n;
14     int cnt=0;
15     for(int i=0;i<n;i++)
16     {
17         cin>>a[i];
18         if(a[i]!=0)
19         {
20             c.push_back(a[i]);
21         }
22     }
23     b[0]=a[0];
24     if(!is_sorted(c.begin(),c.end()))
25     {
26         cout<<-1<<endl;
27         return ;
28     }
29     for(int i=1;i<n;i++)
30     {
31         b[i]=b[i-1]+a[i];
32     }
33     for(int i=0;i<n;i++)
34     {
35         cout<<b[i]<<" ";
36     }
37     cout<<endl;*/
38     
39     cin >> n;
40     for(int i=1;i<=n;i++)
41     {
42         cin>>a[i];
43     }
44     s[1]=a[1];
45     
46     for(int i=2;i<=n;i++)
47     {
48         if((a[i]<=s[i-1])&&a[i])
49         {
50             cout<<-1<<endl;
51             return ;
52         }
53         s[i]=s[i-1]+a[i];
54     }
55     for(int i = 1; i <= n ; i ++ ) 
56     cout << s[i] << " "; 
57     cout << endl;
58     
59 }
60 signed main()
61 {
62     IOS;
63     cin>>t;
64     while(t--)
65     {
66         solved();
67     }
68     return 0;
69 }

2.https://codeforces.com/problemset/problem/1741/B

大体题意:

要求构造这样的一个数组,满足a[i]!=i的前提下并且与前一位相差1

做法:

现特判,对于n=3肯定是不行的,因为对于1~3肯定有一个数不满足上面的条件,其余的只要是错位输出就满足条件了

可以先输出从3往后的,最后在输出2,1

参考代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int N=2e5+10;
int a[N];
int t;
void solved()
{
    int n;
    cin>>n;
    if(n==3)
    {
        cout<<-1<<endl;
        return ;
    }
    else
    {
        for(int i=3;i<=n;i++)
        {
            cout<<i<<" ";
        }
        cout<<2<<" "<<1<<endl;
    }
}
signed main()
{
    IOS;
    cin>>t;
    while(t--)
    {
        solved();
    }
    return 0;
}

3.https://codeforces.com/problemset/problem/1738/B

大意:

给定一个前缀和数组s,表示的是从s[n-k+1]~s[n]的前缀和数组

前缀和数组定义:

 

要求判断这个前缀和数组是不是可以被构造的(即满足上面的前缀和定义),并且构成这个前缀和数组的原来a数组还必须是非递减序

做法:

首先k==1,即前n个a[i]的和

另外在根据差分公式还原后k-1个a数组,

并且判断原来的a数组是否是递减的;

假设前n-k+1个a数组的和是b[n-k+2],那就设前n-k+1个a[i]都等于a[n-k+1]实现最大化

那对于b[n-k+2]来说,肯定是要满足小于等于(n-k+1)*a[n-k+1]的

然后判断是或不是的情况就可以了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 5 const int N=1e5+10;
 6 int a[N];
 7 int n;
 8 int t;
 9 int s[N];
10 int k;
11 void solved()
12 {
13     /*bool flag=false;
14     cnt=0;
15     ans.clear();
16     cin>>n>>k;
17     if(n-k+1<=0)
18     {
19         cout<<"No"<<endl;
20         return ;
21     }
22     for(int i=1;i<=n;i++)
23     {
24         cin>>a[i];
25         ++cnt;
26     }
27     int sum=0;
28     for(int i=n-k+1;i<=n;i++)
29     {
30         sum=0;
31         for(int j=1;j<=i;j++)
32         {
33             sum+=a[j];
34         }
35         ans+=sum;
36     }
37     if(is_sorted(a+1,a+1+n)&&ans==k)
38     {
39         cout<<"Yes"<<endl;
40     }
41     else
42     {
43         cout<<"No"<<endl;
44     }*/
45     cin>>n>>k;
46     for(int i=n-k+1;i<=n;i++)
47     {
48         cin>>s[i];
49     }
50     for(int i=n;i>=n-k+2;i--)
51     {
52         a[i]=s[i]-s[i-1];
53     }
54     if(k==1)
55     {
56         cout<<"Yes"<<endl;
57         return ;
58     }
59     for(int i=n-1;i>=n-k+2;i--)
60     {
61         if(a[i]>a[i+1])
62         {
63             cout<<"No"<<endl;
64             return ;
65         }
66     }
67     int tmp=s[n-k+1];
68     if(tmp<=(n-k+1)*a[n-k+2])
69     {
70         cout<<"Yes"<<endl;
71     }
72     else
73     {
74         cout<<"No"<<endl;
75     }
76 }
77 signed main()
78 {
79    // IOS;
80     cin>>t;
81     while(t--)
82     {
83         solved();
84     }
85     return 0;
86 }

AT回宿舍再写

 

标签:cout,int,cf,long,solved,数组,小题,专练,define
From: https://www.cnblogs.com/LQS-blog/p/16834109.html

相关文章

  • CF1690(Div3) E. Price Maximization 好题
    题目传送门首先,可以发现,我们不关心原数字的大小,只关心他们除以\(k\)之后的余数。如此考虑:两个数相加,\((a+b)/k=a/k+b/k+(a\)\(mod\)\(k+b\)\(mod\)......
  • CF/AT 乱做/补题
    2021CFRound830CFRound829CFEducational138杂题选做......
  • CF1754 题解
    比赛链接:https://codeforces.com/contest/1754题解:AB水题//bySkyRainWind#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include......
  • CF1637F
    首先可以发现一个性质,只会在叶子节点建造塔。发现节点\(u\)可以收到信号等价于以\(u\)作为根的时候至少有两个不同的子树内有\(\geh_u\)的塔。选高度最大的点作为......
  • CF Round #829 题解 (Div. 2)
    F没看所以摆了.看拜月教教主LHQ在群里代打恰钱/bx目录A.TechnicalSupport(*800)B.KevinandPermutation(*800)C.MakeNonzeroSum(C1*1300,C2*1500)D.F......
  • CF Educational Round 138 乱做
    做着玩的。因为倒着做的,所以倒着写。F10.1tyy讲过套路。然后这场在他讲完之后。我愿称之为押题大师。不幸的是这场没打,不然上大分了。先树上差分,然后对于每一个节点记......
  • CF 464C Substitutes in Number 题解
    前置知识:\((a+b)\equiv(a\bmodp+b\bmodp)\pmod{p}\)。同余定理使用后不能再修改数字。那么为了能用这个公式,我们倒序处理每个数字。定义\(d_i\)为\(10\)的位数\(......
  • 【CF1753E】N Machines(暴力+二分)
    题目链接给定一个操作序列,包含\((+,a_i),(\times,a_i)\)两种操作。初始\(x=1\),会从左到右依次执行所有操作得到一个终值\(x'\)。共有\(lim\)块钱,可以花\(p1\)......
  • CF708E Student's Camp
    Student'sCampCodeforces708ELuoguCF708E题面翻译有一个\((n+2)\timesm\)的网格。除了第一行和最后一行,其他每一行每一天最左边和最右边的格子都有\(p\)的概......
  • 易基因|干货:cfDNA甲基化测序实验怎么做,看完你就知道了
    大家好,这是专注表观组学十余年,领跑多组学科研服务的易基因。本期,我们讲讲cfDNA重亚硫酸盐测序(cfDNA-RBS)实验怎么做,从技术原理、建库测序流程、信息分析流程等方面详细介......