6 条题解
-
1
非常好贪心算法,爱来自二刺螈
#include<bits/stdc++.h> using namespace std; int a[1000000]; int main() { int w,n,pi=0; cin>>w>>n; for(int i=0;i<n;i++)cin>>a[i]; sort(a,a+n);//数据输入+排序 for(int i=0,j=n-1;i<=j;i++,j--){ pi++; if(a[i]+a[j]>w)i--; }//最关键的贪心算法,将在下面讲解 cout<<pi; }
for(int i=0,j=n-1;i<=j;i++,j--){ pi++; if(a[i]+a[j]>w)i--; }
这个代码是如何成立的? 在排序之后,我们知道最大的数和最小的数是放在末尾和首位的,通过头尾的推进来逼近所给的w值。若两数之和大于w,则末尾的大数分一组,而首位等待下一次分配(这一点是最巧妙的)。若分配完后还剩一个,独立分组后立即退出,不会有任何影响。
-
0
#include <bits/stdc++.h> using namespace std; int main() { int w,n,a[10000]; cin>>w; cin>>n; for (int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); int i=1,j=n,num=0; while (i<j) { if (a[i]+a[j]<=w) { num++; i++; j--; // cout<<num<<" "; continue; } if (a[i]+a[j]>w) { num++; j--; // cout<<num<<" "; continue; } } if (i==j) num++; cout<<num<<endl; return 0; }``` 普普通通中规中矩没有什么技术含量的代码……
-
0
#include<bits/stdc++.h> using namespace std; int a[30000000]; int main(){ int n,m; cin>>n>>m; for(int i=1;i<=m;i++){ cin>>a[i]; } int ans=0; sort(a+1,a+1+m); // int r=m; int l=1; // while(l<=r){ int x=a[l]; int y=a[r]; if(x+y>n){ r--; ans++; } else { l++; r--; ans++; } } cout<<ans; return 0; }
-
0
#include<bits/stdc++.h> using namespace std; int a[10000]; int main() { int n,m,sum=0; cin>>n>>m; for(int i=1;i<=m;i++) { cin>>a[i]; } sort(a+1,a+1+m); int i=1,j=m; while(i<=j) { if(a[i]+a[j]<=n) { sum++; i++; j--; } else if(a[i]+a[j]>n) { sum++; j--; } else if(i==j) { sum++; i++; j--; } } cout<<sum; return 0; }
一遍过
- 1
信息
- ID
- 334
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 421
- 已通过
- 155
- 上传者