小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序。100天过去了,小Ho查看自己的提交记录发现有N天因为贪玩忘记提交了。于是小Ho软磨硬泡、强忍着小Hi鄙视的眼神从小Hi那里要来M张"补提交卡"。每张"补提交卡"都可以补回一天的提交,将原本没有提交程序的一天变成有提交程序的一天。小Ho想知道通过利用这M张补提交卡,可以使自己的"最长连续提交天数"最多变成多少天。
(0 <= N, M <= 100)
分析:贪心
要想连续的天数,不提交卡肯定用在连续的空缺上,所以枚举从第一个空缺开始连续m,从二个空缺开始连续m......以此类推
对于每次枚举起点我的做法是:用得把数组的相应空缺位置b[i]置0,遍历数组b[],计算最大的连续天数
但是这次的枚举修改的b[],下次枚举要改回来,所以我直接利用函数的值传参特性,所以数组用的vector<int> b而不是用int b[],因为数组传参相当于指针传参,修改是有效的
1 #include<iostream> 2 #include<cstring> 3 #include<vector> 4 #include<algorithm> 5 using namespace std; 6 7 int t,n,m; 8 int a[200]; 9 10 11 int func(vector<int> b,int i) 12 { 13 int ans=0; 14 for(int j=0;j<m;j++){ 15 b[a[i+j]]=0; 16 } 17 int sum=0; 18 for(int i=1;i<=100;i++){ 19 if(b[i]==0) sum++; 20 else{ 21 ans=max(ans,sum); 22 sum=0; 23 } 24 } 25 return ans; 26 } 27 28 int main() 29 { 30 cin>>t; 31 while(t--){ 32 cin>>n>>m; 33 vector<int> b(200); 34 for(int i=0;i<n;i++){ 35 cin>>a[i]; 36 b[a[i]]=1; 37 } 38 if(n<=m) cout<<100<<endl; 39 else{ 40 sort(a,a+n); 41 int ans=0; 42 for(int i=0;i+m-1<n;i++){ 43 ans=max(ans,func(b,i)); 44 } 45 cout<<ans<<endl; 46 } 47 } 48 }
时间: 2024-11-15 08:51:13