> 方法1
#include#include #include using namespace std; int a[6]={0}; int b[6]={1,5,10,50,100,500}; int A=0; int res = 0; void solve1() { int p = 5;//硬币指针 while(A) { if(b[p]<=A && a[p]>0) { res++; A-=b[p]; a[p]--; } if(b[p]>A || a[p]==0) { p--; } } } int main() { for(int i = 0;i < 6;i++) { scanf("%d",&a[i]); } scanf("%d",&A); solve(); cout< 方法2
#include#include #include using namespace std; int a[6]={0}; int b[6]={1,5,10,50,100,500}; int A=0; int res = 0; void solve() { for(int i = 5;i >=0;i--) { int t = min(A/b[i],a[i]); A-=t*b[i]; res+=t; } } int main() { for(int i = 0;i < 6;i++) { scanf("%d",&a[i]); } scanf("%d",&A); solve(); cout< 2 调度问题 贪心算法
贪心策略,每次都选结束时间最早的#include#include #include using namespace std; #define MAX_N 100010 int s[MAX_N]={0}; int n = 0; int e[MAX_N]={0}; pair itv[MAX_N]; void solve() { for(int i = 0;i < n;i++) { //按照结束时间排序 itv[i].first = e[i]; itv[i].second = s[i]; } sort(itv,itv+n); int ans=0,t=0;//t是最后所选工作的结束时间 for(int i = 0;i if(t ans++; t = itv[i].first; } } printf("%d",ans); } int main() { scanf("%d",&n); for(int i = 0;i scanf("%d",&s[i]); } for(int i = 0;i scanf("%d",&e[i]); } solve(); system("pause"); return 0; }



