11号每日三题:
A题:
题意:自行理解
思路:比较简单,只是特判需要注意
代码如下:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;
const int N=3e5+10;
const int mod=998244353;
struct nod{
int d,h;
}b[1100];
int n,x;
int ma1,ma2;
void solve(){
ma1=ma2=0;
cin >> n >> x;
bool iff=0;
for(int i=1;i<=n;i++){
cin >> b[i].d >> b[i].h;
if(b[i].d>b[i].h || b[i].d>=x) iff=1;
ma1=max(b[i].d,ma1);
ma2=max(b[i].d-b[i].h,ma2);
}
if(!iff){cout << -1 << endl; return ;}
if(ma2==0){cout << 1 << endl; return ;}
// cout << ma1 << " " << ma2 << endl;
int lef=max(x-ma1,0);
int ans=lef/ma2+1;
// cout << lef << " " << ans << endl;
if(lef%ma2) cout << ans+1 << endl;
else cout << ans << endl;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
cin >> t;
while(t--) solve();
return 0;
}
//make it count
//开ll plz
B题:
题意:
星期二学了二叉树的非递归的前中后遍历(问就是数据结构作业。
星期三决定学习下dp,一直是我的薄弱点。
一道基础dp(我知道很基础):
星期四做了道之前三题的a题:
题意:自行理解
思路:无需多言
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;
const int N=2e5+10,M=1e9+10;
const int mod=998244353;
int n,h;
int p[N];
int ans;
void solve(){
ans=0;
cin >> h >> n;
for(int i=1;i<=n;i++){
cin >> p[i];
}
p[n+1]=0;
for(int i=1;i<=n-1;i++){
if(p[i+1]-p[i+2]!=1){
ans++;
}else{
i++;
}
}
cout << ans << endl;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
cin >> t;
while(t--) solve();
return 0;
}
//make it count
//开ll plz
星期五每日三题:
a题:
题意:自行理解
思路:思路是网上看的,我只负责了代码实现,但tle,插个眼先(补:不开ll见祖宗,拖了我一个小时,心态炸裂)
代码如下:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;
const int N=2e5+10,M=1e9+10;
const int mod=998244353;
ll n;
ll l,r,idx,tmp;
void solve(){
idx=0,tmp=0;
bool iff=0;
cin >> n >> l >> r;
if(r==n*(n-1)+1){
if(l==r){
cout << 1 << endl;
return ;
}
iff=1,r--;
}
for(int i=1;i<n;i++){
idx+=(n-i)*2;
if(idx>=l){
for(int j=l;j<=r;j++){//原来是没开ll导致的
if(j>idx){
tmp=idx;
idx+=(n-++i)*2;
}
if(j&1) cout << i << " ";
else{
cout << i+(j-tmp)/2 << " ";
}
}
break;
}
tmp=idx;
}
if(iff) cout << 1;
cout << endl;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
cin >> t;
while(t--) solve();
return 0;
}
//make it count
//开ll plz
星期五晚打了场div3,被狠狠地拿下了,补几道题:
B题:
题意:自行理解
思路:前缀和,但我当时不到怎么回事,想成树状数组做的,属于是脑子抽了
代码:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;
const int N=2e5+10,M=1e9+10;
const int mod=998244353;
int n;
ll a[N];
ll ans;
void solve(){
memset(a,0,sizeof(a));
ans=0;
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
a[i]+=a[i-1];
}
for(int i=1;i<=n/2;i++){
if(n%i) continue;
ll maxx=0,minn=LONG_LONG_MAX;
for(int j=i;j<=n;j+=i){
maxx=max(1ll*a[j]-a[j-i],maxx);
minn=min(1ll*a[j]-a[j-i],minn);
}
ans=max(maxx-minn,ans);
if(ans==0){cout << 0 << endl; return ;}
}
cout << ans << endl;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
cin >> t;
while(t--) solve();
return 0;
}
//make it count
//开ll plz
C题:
题意:最大子串和,但同奇偶性的俩元素不联通
思路:经典dp,小变一下就ok。比赛时没过,可能是因为脑抽开了个vector存不联通下标,为什么不直接实时判断呢,为什么呢?
代码:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;
const int N=2e5+10,M=1e9+10;
const int mod=998244353;
int n;
int a[N];
int dp[N];
int ans;
void solve(){
// for(int i=0;i<=n;i++) dp[i]=INT_MIN;
ans=INT_MIN;
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
dp[i]=a[i];
}
for(int i=1;i<=n;i++){
if((a[i]&1)==(a[i-1]&1)) dp[i]=a[i];
else dp[i]=max(a[i],a[i]+dp[i-1]);
}
for(int i=1;i<=n;i++) ans=max(dp[i],ans);
cout << ans << endl;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
cin >> t;
while(t--) solve();
return 0;
}
//make it count
//开ll plz
周日:
今天英雄联盟s13总决赛,wbg被t1零封拿下,虽然已经做好了输的准备,但输的如此彻底,还是有点难受。
星期六的每日三题:
题意:给一数n,坐标轴上有0到n+1的城镇,每座镇有1 /2的几率建一座信号塔,功率为p(自定),能辐射到自己和左右两边坐标差小于p的城镇。要求0和n+1这俩镇不能有信号,1到n有且仅有一次信号覆盖,问其可能性。
思路:没思路。上网看发现是dp,dp完后能发现是斐波那契数列的规律。
设dp[i]为有i座城镇时的可行方案数,如果第i座城镇建一p为1的信号塔,那么dp[i]为dp[i-1],如果第i座城镇是被i-1的信号覆盖,那么i-1的信号将覆盖i-2和i,dp[i]+=dp[i-3]
由此可得dp[i]=dp[i-1]+dp[i-3]+dp[i-5]...至于怎么进一步推出斐波那契,就不明白了