恶龙的m个头,直径不同,骑士的能力不同,付的金币不同,杀完龙最少的金币,不能杀完输出“...”
输入:
m n
m行表示直径
n行表示骑士能杀的直径范围,并且应支付这么的金币
0 0 为结束行
#include<iostream> using namespace std; #include<cstdio> #include<algorithm> #include<cstring> int ans,get,drag,peo,a[20010],b[20010]; int main() { while(scanf("%d%d",&drag,&peo)==2 && drag && peo){ for(int i=0;i<drag;++i) scanf("%d",&a[i]); for(int i=0;i<peo;++i) scanf("%d",&b[i]); ans=0; get=0; sort(b,b+peo); sort(a,a+drag); for(int i=0;i<peo;++i){ // 一个数组搜索,另一个数组维护当前值 if(b[i]>=a[get]){ get++; ans+=b[i]; } if(get==drag) break; } if(get==drag) printf("%d ",ans); else puts("Loowater is doomed!"); } return 0; }
11729 分配工作
交代需要时间,做完工作需要时间。
贪心,列式子(分类)可知,工作需时间长的先交代
输入:
n // n个人
b1 j1
b2 j2 //n行,两个数据,第一个是交代需要的时间,第二个是做完工作需要的时间
0为结束行
#include<cstdio> #include<algorithm> #include<vector> using namespace std; int n; struct job{ int j,b; bool operator < (const job& a) const { return j > a.j; } }; int main(){ int b,j,kase = 0; while(scanf("%d", &n)==1 && n){ vector<job> v; for(int i=0;i<n;++i){ scanf("%d%d",&b,&j); v.push_back( (job){j,b} ); } sort(v.begin(),v.end()); int ans=0,s=0; for(int i=0;i<n;++i){ s+=v[i].b; ans= max(ans,s+v[i].j); } printf("Case %d: %d ",++kase,ans); } return 0; }