暑假补题记 1
题目意思就是:有n个任务,每一个任务都有K个小任务每一个小任务都有指定时间,之后做完一个大任务额外加一分,然后给你M分钟,问在M分钟里,你需要得到最多分是多少。
题解:首先对K个小任务排个序,对n个大任务进行遍历,就是你做完一个大任务,其他的时间全部搞小任务,然后一个个n进行比较,看看做几个大任务最优进行了
#include <bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #define int long long using namespace std; const int N=1000; int a[N],b[N]; ::int32_t main(){ int n,k,M; cin>>n>>k>>M; int aa=0; for(int i=1;i<=k;i++) { cin>>a[i]; aa+=a[i]; } sort(a+1,a+1+k); int sum=0,ans=0,kpl=0,to=0; for(int i=0;i<=n;i++) { kpl=aa*i; if(kpl>M)break; sum=M-kpl,ans=(k+1)*i; for(int j=1;j<=k;j++) { if(a[j]<=sum) { int x=sum/a[j]; if(x>=n-i) x=n-i; sum=sum-a[j]*x; ans+=x; if(j==k) ans+=x; } } to=max(to,ans); } cout<<to; return 0; }
题意:在数组中找3个最小的数组成三元组,问有多少个这样小的三元组,其实就是有重复的数字进行选择,然后全排列。
题解:先排列,看看有多少个第3个数在这个数组里,然后就排列即可。
#include <bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define int long long using namespace std; const int N=1e6+10; int a[N]; ::int32_t main(){ int n; cin>>n; for(int i=1; i<=n; i++) { cin>>a[i]; } sort(a+1,a+n+1); int sum=0; for(int i=1; i<=n; i++) { if(a[i]==a[3]) sum++; } if(a[1]==a[2]&&a[2]==a[3]){ cout<<(sum*(sum-1)*(sum-2))/6; return 0; } if(a[2]==a[3]){ cout<<(sum*(sum-1))/2; return 0; } cout<<sum; return 0; }
题意: 意思就是这个数字的每一位相加原来的数减去即可,然后如果比s大就是一个真正大的数字,然后给一个1到n的区间问这个区间有多少个真正大的数字。
题解:用二分去寻找即可。
#include <bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define int long long using namespace std; const int N=1e6+10; int wei(int n){ int a,ans=0; while (n){ a=n%10; ans=ans+a; n=n/10; } return ans; } ::int32_t main(){ int n,s; cin >> n >> s; int l=1,r=n; while (l<=r) { int mid=(l+r)/2; if(mid-wei(mid)>=s) r=mid-1; else l=mid+1; } if(r<n) cout<<n-l+1; else cout<<0; return 0; }
题意:就是在一个n*m的图里,有k个小伙伴和一个我,每分钟每个人都要走一步到上下左右相邻的房间中,给你我的位置和K个人的位置,问你能不能不被抓到。
题解:就是如果这k个人初始位置如果不在对角线上即可。
#include <bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> #define int long long using namespace std; const int N=1e6+7; int32_t main() { int t; cin>>t; int n,m,k; while (t--) { cin>>n>>m>>k; int x,y; cin>>x>>y; int f=0; for(int i=1;i<=k;i++) { int xx,yy; cin>>xx>>yy; if((x+y) % 2 == (xx+yy) % 2) { f=1; } } if(!f) { cout<<"YES"<<endl; } else cout<<"NO"<<endl; } return 0; }
L-Look Up_第二周训练题单 (nowcoder.com)
题意:对比后者和前者身高,如果最近的一个身高高于他则输出下标,没有则输出0.
题解:用一个stack如果为空打0,否则对比当前数小的全部出栈即可。
#include <bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> #define int long long using namespace std; const int N=1e6+7; int a[N],c[N]; int32_t main() { stack <int> b; int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=n;i>=1;i--) { while (b.size()!=0 && a[b.top()]<=a[i]) b.pop(); if(b.size()==0) { c[i]=0; } else c[i]=b.top(); b.push(i); } for(int i=1;i<=n;i++) { cout<<c[i]<<endl; } return 0; }