寒假每日一题(提高组)Week 2 完结

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寒假每日一题(提高组)Week 2 完结相关的知识,希望对你有一定的参考价值。

目录

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 完结的主要内容,如果未能解决你的问题,请参考以下文章

寒假每日一题(提高组)Week 4 完结

寒假每日一题(提高组)Week 1 完结

寒假每日一题(入门组)week2 完结

寒假每日一题(入门组)week3 完结

寒假每日一题(入门组)week7 完结

寒假每日一题(入门组)week4 完结