这次比赛有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