Educational Codeforces Round 80 (Rated for Div. 2)参加感悟

这次比赛有14000+的人报名,结果我得了266名,创了新纪录。

进过这次比赛,我有回答了1800+。

寒假到了,又可以每次比赛都打了。平时进步很慢,我希望能在寒假有更大的进步。

作为寒假第一场比赛,发挥让我还是很满意的。

开始讲题:

A:

http://codeforces.com/contest/1288/problem/A

这题太水了,直接是sqrt(d)-1和sqrt(d),如果它们不行,那么其他的也肯定不行。

直接上代码:

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define F first
 4 #define S second
 5 #define P pair
 6 #define FOR(i,a,b) for(int i=a;i<=b;i++)
 7 #define V vector
 8 #define RE return
 9 #define ALL(a) a.begin(),a.end()
10 #define MP make_pair
11 #define PB push_back
12 #define PF push_front
13 #define FILL(a,b) memset(a,b,sizeof(a))
14 using namespace std;
15 void solve(){
16     int n,d;
17     cin>>n>>d;
18     int t=sqrt(d);
19     int ans=min(t+d/(t+1)+(d%(t+1)!=0),t-1+d/t+(d%t!=0));
20     if(ans>n){
21         cout<<"NO\n";
22     }else cout<<"YES\n";
23 }
24 int main(){
25     ios::sync_with_stdio(0);
26     cin.tie(0);
27     int t;
28     cin>>t;
29     while(t--)solve();
30     return 0;
31 }

B:

这题就是在y为数字9组成的情况下,x取任何值都可以,也是很简单的一题。

代码:

 1 #include<bits/stdc++.h>
 2 #define int long long
 3 #define F first
 4 #define S second
 5 #define P pair
 6 #define FOR(i,a,b) for(int i=a;i<=b;i++)
 7 #define V vector
 8 #define RE return
 9 #define ALL(a) a.begin(),a.end()
10 #define MP make_pair
11 #define PB push_back
12 #define PF push_front
13 #define FILL(a,b) memset(a,b,sizeof(a))
14 using namespace std;
15 void solve(){
16     int x,y;
17     cin>>x>>y;
18     int t=9,ans=0;
19     while(y>=t){
20         ans++;t=t*10+9;
21     }
22     cout<<ans*x<<‘\n‘;
23 }
24 signed main(){
25     ios::sync_with_stdio(0);
26     cin.tie(0);
27     int t;
28     cin>>t;
29     while(t--)solve();
30     return 0;
31 }

C:

这题因为a不降序,b不升序,所以只要an<=bn那么这两个序列肯定符合ai<=bi。

可以直接枚举an和bn,再用DP预处理好的方案数相乘得到结果。

上代码:

 1 #include<bits/stdc++.h>
 2 #define int long long
 3 #define F first
 4 #define S second
 5 #define P pair
 6 #define FOR(i,a,b) for(int i=a;i<=b;i++)
 7 #define V vector
 8 #define RE return
 9 #define ALL(a) a.begin(),a.end()
10 #define MP make_pair
11 #define PB push_back
12 #define PF push_front
13 #define FILL(a,b) memset(a,b,sizeof(a))
14 using namespace std;
15 int p[1005][15],mod=1e9+7;
16 signed main(){
17     ios::sync_with_stdio(0);
18     cin.tie(0);
19     int x,y;
20     cin>>x>>y;
21     int ans=0;
22     p[1][0]=1;
23     FOR(i,1,y){
24         FOR(j,1,x){
25             p[j][i]=(p[j-1][i]+p[j][i-1])%mod;
26         }
27     }
28     FOR(i,1,x){
29         FOR(j,i,x){
30             ans=ans+p[i][y]*p[x-j+1][y];ans=ans%mod;
31         }
32     }
33     cout<<ans;
34     return 0;
35 }

D:

一般我发博客都是重点讲D题,今天当然也不例外。

这道题我能在比赛时做出来,也有一些运气因素,因为我试的第一条思路,就碰巧试对了。

这道题一看肯定试无从下手,但细细想一想,就会发现二分是一个突破口。

首先,可以二分这个最小值。二分完最小值之后,我们可以用去重去处理。因为,在给定一个标准时,我们只关心大小,至于大多少,小多少,这是不需要关心的,所以状态数最多不会超过2的m次方次。这时只要发现两种状态每一位两个数之中都有一个数比最小值大,都能互补,且这两种状态在给定的序列中都有,那么这个最小值就成立。

总体来说思路应该不是很难懂,但是注意这题可能会卡常,所以不要大量使用数据结构,应该就能过。

代码:

 1 #pragma GCC optimize(3)
 2 #include<bits/stdc++.h>
 3 #define ll long long
 4 #define F first
 5 #define S second
 6 #define P pair
 7 #define FOR(i,a,b) for(int i=a;i<=b;i++)
 8 #define V vector
 9 #define RE return
10 #define ALL(a) a.begin(),a.end()
11 #define MP make_pair
12 #define PB push_back
13 #define PF push_front
14 #define FILL(a,b) memset(a,b,sizeof(a))
15 using namespace std;
16 int a[300005][10];
17 int n,m;int f[1000];
18 P<int,int> ans ;
19 bool check(int mid){
20     FILL(f,0);
21     FOR(i,1,n){
22         int t=0;
23         FOR(j,1,m){
24             if(a[i][j]>=mid)t+=(1<<(j-1));
25         }
26         f[t]=i;
27     }
28     FOR(i,0,(1<<m)){
29         FOR(j,0,(1<<m)){
30             bool anf=1;
31             FOR(k,0,m-1){
32                 if(!(i&(1<<k))&&!(j&(1<<k))){
33                     anf=0;break;
34                 }
35             }
36             if(anf&&f[i]&&f[j]){
37                 ans.F=f[i];ans.S=f[j];return 1;
38             }
39         }
40     }
41     return 0;
42 }
43 int main(){
44     ios::sync_with_stdio(0);
45     cin.tie(0);
46     cin>>n>>m;
47     FOR(i,1,n){
48         FOR(j,1,m)cin>>a[i][j];
49     }
50     int l=0,r=2147483647,mid;
51     while(r>=l){
52         mid=(l+r)>>1;
53         if(check(mid)){
54             l=mid+1;
55         }else r=mid-1;
56     }
57     cout<<ans.F<<‘ ‘<<ans.S;
58     return 0;
59 }

好了,寒假第一次打比赛,加了84分,加油!!!

原文地址:https://www.cnblogs.com/njwsf/p/12199276.html

时间: 2024-10-28 21:38:38

Educational Codeforces Round 80 (Rated for Div. 2)参加感悟的相关文章

Educational Codeforces Round 80 (Rated for Div. 2)

\[Educational\ Codeforces\ Round\ 80\ (Rated\ for\ Div.\ 2)\] A.Deadline 打勾函数找最小值,在\(\sqrt{d}\)邻域里找\(x\)最小化\(x+\lceil\frac{d}{x+1}\rceil\)即可 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<bits/stdc++.h> using namespace

Educational Codeforces Round 80 (Rated for Div. 2)(C - Two Arrays )

C - Two Arrays 题目链接:https://codeforces.com/contest/1288/problem/C 题目: 题意:给你n,m,利用1~n之间的数(可重复)来组成长度为m的数组a,b,要求数组a非递减,数组b非递增,且a数组的数<=b数组中的数,求出a,b数组对数 思路:用动态规划,dp[i][j]是第i个位置放数字j的方案数,根据题意可以将b数组反置然后接在a后面,则该数组长度为2m,为一个非递减序列,则就是求1~n这些数字可重复组成多少种长度为2m的非递减序列,

Educational Codeforces Round 80 (Rated for Div. 2(A Deadline )

(A) Deadline 题目: 思路:一开始还傻傻的暴力康康....只要求出令x=n的一半就行,然后判断 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 //freopen("text","r",stdin); 6 int T; 7 scanf("%d",&T); 8 while(T--) 9 { 10 //cout<<cei

题解 Educational Codeforces Round 80 [Rated for Div. 2](CF1288)

前言:11点的时候某天下第一可爱的萌神问我怎么不打CF,跑去开题,11:30终于开了C和D,秒了一下,考后萌神轻松上分并告诉我E的tag于是我赛后补题. A:n/x上取整是(n-1)/x+1,式子变形成x+1+(n-1)/(x+1)<=d.根据a+b>=2√ab随便化简一下.(20s秒了??) 1 #include<stdio.h> 2 #include<math.h> 3 using namespace std; 4 int T,n,d,x,y; 5 int main

Educational Codeforces Round 80 (Rated for Div. 2) C - Two Arrays(DP)

???♀? ???♀? ???♀? 题意:从1~n里面选出来m个数字组成a数组,再选出来m个组成b数组,要求a非递减,b非递增,且bi>=ai 1,说是选两个数组其实就是选出来一个长m*2的非递减数组 2,假设要从n的全排列中选出来m长的非递减数组,因为元素是可重复的,最多重复m次,其实就是相当于从下面这个矩阵中选择元素 从这个矩阵中选择元素,每行只能选择一个,枚举我们选出的k个元素的最小值为[ i , j ]位置,那么除去这个元素选择k-1个元素的方案数之和就是k个元素,如图中红色标出位置,最

Educational Codeforces Round 80 (Rated for Div. 2)C(DP)

1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 const long long mod = 1e9+7; 5 long long pre[1007][1007],temp[1007][1007]; 6 int main(){ 7 ios::sync_with_stdio(false); 8 cin.tie(NULL); 9 cout.tie(NULL); 10 int n,m;

Educational Codeforces Round 80 (Rated for Div. 2)部分题解

A. Deadline 题目链接 题目大意 给你\(n,d\)两个数,问是否存在\(x\)使得\(x+\frac{d}{x+1}\leq n\),其中\(\frac{d}{x+1}\)向上取整. 解题思路 方案一:利用均值不等式公式推导 \(x+\frac{d}{x+1}=x+1+\frac{d}{x+1}-1\geq2\sqrt{d}-1\) 所以 \(\min(x+\frac{x}{d+1})=2\sqrt{d}-1\) 因此去判断\(2\sqrt{d}-1\leq n\)是否成,即\(4\

Educational Codeforces Round 80 (Rated for Div. 2)【A,B,C,D】C题DP{GG了} D题【数组转化成二进制形式判断+二分】

A题直接暴力水过 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 #define N 6666666 6 int arr[N]; 7 8 signed main(){ 9 int _;cin>>_; 10 while(_--){ 11 int n,m; 12 cin>>n>>m; 13 if(n>=m){ 14 cout<<"

Educational Codeforces Round 80 (Rated for Div. 2) 题解

Deadline Yet Another Meme Problem Two Arrays Minimax Problem Messenger Simulator Deadline \[ Time Limit: 2 s\quad Memory Limit: 256 MB \] 这是个对勾函数,所以最小的话是在 \(sqrt\) 位置,所以只要找这附近的数字就可以了. view /************************************************************