寒假每日一题(提高组)【Week 2 完结】
生活随笔
收集整理的這篇文章主要介紹了
寒假每日一题(提高组)【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 node{int 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 1 完
- 下一篇: 寒假每日一题(提高组)【Week 3 完