寒假每日一题(提高组)Week 2 完结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寒假每日一题(提高组)Week 2 完结相关的知识,希望对你有一定的参考价值。
目录
- 1230. K倍区间【思维 前缀和】
- 1613. 数独简单版【dfs】
- 122. 糖果传递【贪心】
- 125. 耍杂技的牛【贪心】
- 499. 聪明的质监员【二分+前缀和】
- 503. 借教室【二分+差分】
- 257. 关押罪犯【二分+二分图染色】
1230. K倍区间【思维 前缀和】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long int s[N],cnt[N],ans,n,k;
int main(void)
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>s[i],s[i]+=s[i-1];
cnt[0]=1;
for(int i=1;i<=n;i++)
ans+=cnt[s[i]%k];
cnt[s[i]%k]++;
cout<<ans;
return 0;
1613. 数独简单版【dfs】
#include<bits/stdc++.h>
using namespace std;
const int N=25;
int cnt=0,row[N][N],col[N][N],calc[N][N][N],stx,sty;//row[i][j] 第i行数字j是否有 calc[i][j][k] 方块[i][j] k是否存在
string s[N];
vector<pair<int,int>>ve;
void dfs(int x,int y,int index)
if(index==cnt)
for(int i=0;i<9;i++) cout<<s[i]<<endl;
return;
for(int i=1;i<=9;i++)
if(!row[x][i]&&!col[y][i]&&!calc[x/3][y/3][i])
row[x][i]=col[y][i]=calc[x/3][y/3][i]=1;
s[x][y]='0'+i;
dfs(ve[index+1].first,ve[index+1].second,index+1);
row[x][i]=col[y][i]=calc[x/3][y/3][i]=0;
s[x][y]='.';
int main(void)
for(int i=0;i<9;i++) cin>>s[i];
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
if(s[i][j]=='.')
cnt++,stx=i,sty=j;
ve.push_back(i,j);
else
int c=s[i][j]-'0';
row[i][c]=1;
col[j][c]=1;
calc[i/3][j/3][c]=1;
ve.push_back(1,1);
dfs(ve[0].first,ve[0].second,0);
return 0;
122. 糖果传递【贪心】
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long int LL;
LL a[N],s[N],c[N],n;
int main(void)
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];
LL avg=s[n]/n;
for(int i=1;i<=n;i++) c[i]=avg*i-s[i];
sort(c+1,c+n+1);
LL temp=c[(n+1)/2];
LL sum=0;
for(int i=1;i<=n;i++) sum+=abs(temp-c[i]);
cout<<sum;
return 0;
125. 耍杂技的牛【贪心】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
struct nodeint w,s;;
bool cmp(node a,node b)return a.w+a.s<b.w+b.s;
vector<node>ve;
LL n,sum,ans=-1e9;
int main(void)
cin>>n;
for(int i=0;i<n;i++)
int a,b; cin>>a>>b;
ve.push_back(a,b);
sort(ve.begin(),ve.end(),cmp);
for(int i=0;i<ve.size();i++)
ans=max(ans,sum-ve[i].s);
sum+=ve[i].w;
cout<<ans;
return 0;
499. 聪明的质监员【二分+前缀和】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
LL w[N],v[N],n,m,s;
vector<pair<int,int>>ve;
LL sum(int mid)
LL ans=0;
LL cnt[N]=0,sv[N]=0;
for(int i=1;i<=n;i++)
cnt[i]=cnt[i-1];
sv[i]=sv[i-1];
if(w[i]>=mid) cnt[i]++,sv[i]+=v[i];
for(int i=0;i<ve.size();i++)
int l=ve[i].first,r=ve[i].second;
ans+=(cnt[r]-cnt[l-1])*(sv[r]-sv[l-1]);
return ans;
int main(void)
cin>>n>>m>>s;
for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
while(m--)
int l,r; cin>>l>>r;
ve.push_back(l,r);
int l=0,r=1e6;
while(l<r)
int mid=l+r>>1;
if(sum(mid)<=s) r=mid;
else l=mid+1;
LL ans=min(abs(sum(r)-s),abs(sum(r-1)-s));
cout<<ans;
return 0;
503. 借教室【二分+差分】
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long int LL;
LL s[N],t[N],d[N],r[N],S[N];
LL n,m;
void add(int l,int r,int c)
S[l]+=c;
S[r+1]-=c;
bool check(int mid)
memset(S,0,sizeof S);
for(int i=1;i<=mid;i++) add(s[i],t[i],d[i]);
for(int i=1;i<=n;i++) S[i]+=S[i-1];
for(int i=1;i<=n;i++)
if(S[i]>r[i]) return false;//需要的教室数大于有的
return true;
int main(void)
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>r[i];
for(int i=1;i<=n;i++) cin>>d[i]>>s[i]>>t[i];
if(check(m))
puts("0");
return 0;
int l=0,r=m;
while(l<r)
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
puts("-1");
cout<<r+1<<endl;
return 0;
257. 关押罪犯【二分+二分图染色】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int h[N],e[N],ne[N],w[N],idx;
int color[N],n,m;
void add(int a,int b,int c)
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
bool dfs(int u,int c,int mid)
color[u]=c;
for(int i=h[u];i!=-1;i=ne[i])
int j=e[i];
if(w[i]<=mid) continue;
if(color[j])
if(color[j]==color[u]) return false;
else if(!dfs(j,3-c,mid)) return false;
return true;
bool check(int mid)
memset(color,0,sizeof color);
for(int i=1;i<=n;i++)
if(!color[i]&&!dfs(i,1,mid)) return false;
return true;
int main(void)
cin>>n>>m;
memset(h,-1,sizeof h);
while(m--)
int a,b,c; cin>>a>>b>>c;
add(a,b,c),add(b,a,c);
int l=0,r=1e9;
while(l<r)
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
cout<<l<<endl;
return 0;
以上是关于寒假每日一题(提高组)Week 2 完结的主要内容,如果未能解决你的问题,请参考以下文章