题目意思就是:有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; }
标签:int,sum,long,任务,暑假,ans,题记,include From: https://www.cnblogs.com/whatdo/p/17558000.html