【USC月赛】酸奶工厂
就是简单贪心用一个变量继承最小值然后不停更新就好。#include<map> #include<queue> #include<cmath> #include<cctype> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define qread(x) x=read() #define mes(x,y) memset(x,y,sizeof(x)) #define mpy(x,y) memcpy(x,y,sizeof(x)) #define Maxn 100000 #define INF 2147483647 #define MINF 1073741823 #define LINF 9223372036854775807 #define eps 1e-6 inline int read(){ char ch=getchar(); int f=1,x=0; while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();} return x*f; } int n,c,H[Maxn+1],l,r,ans; bool check(int x){ int sum=0,k=0,v=0; for(int i=1;i<=n;i++){ if(H[i]-H[v]>=x)k++,v=i; } if(k>=c)return true; else return false; } int main(){ qread(n);qread(c); l=MINF;r=-MINF;H[0]=-MINF; for(int i=1;i<=n;i++)qread(H[i]),l=std::min(l,H[i]),r=std::max(r,H[i]); std::sort(H+1,H+n+1); while(l<=r){ int mid=(l+r)/2; if(check(mid)==true){ ans=mid; l=mid+1; } else r=mid-1; } printf("%lld\n",ans); }【USACO月赛】购买饲料
这题就是所有肥料的价格(加上路费)求出来,排个序,取最小的几个就好了呀。#include<map> #include<queue> #include<cmath> #include<cctype> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define qread(x) x=read() #define mes(x,y) memset(x,y,sizeof(x)) #define mpy(x,y) memcpy(x,y,sizeof(x)) #define Maxn 100 #define INF 2147483647 #define eps 1e-6 inline int read(){ char ch=getchar(); int f=1,x=0; while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();} return x*f; } int k,e,n,x,y,c,f[Maxn*Maxn+1],ans; int main(){ qread(k);qread(e);qread(n); f[0]=0; for(int i=1;i<=n;i++){ qread(x);qread(y);qread(c); x=e-x;c+=x; for(int j=1;j<=y;j++)f[++f[0]]=c; } std::sort(f+1,f+f[0]+1); for(int i=1;i<=k;i++)ans+=f[i]; printf("%d\n",ans); }【USACO月赛】公司利润
这题就是教你怎么用On求最大序列#include<map> #include<queue> #include<cmath> #include<cctype> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define qread(x) x=read() #define mes(x,y) memset(x,y,sizeof(x)) #define mpy(x,y) memcpy(x,y,sizeof(x)) #define Maxn 100 #define INF 2147483647 #define eps 1e-6 inline int read(){ char ch=getchar(); int f=1,x=0; while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();} return x*f; } int n,x,sum,ans; int main(){ qread(n); sum=0;ans=-INF; for(int i=1;i<=n;i++){ qread(x); if(sum>0)sum+=x; else sum=x; ans=std::max(ans,sum); } printf("%d\n",ans); }【USACO赛】奶牛工资
有人比我更跑到快,但是为什么我码得更快还a了。其实这题就是用最大的填充满,然后次大的,然后次次大的,然后次次次大的……然后就这样看看能弄多少遍就能给多少次工资了。还有可以优化的就是我可以一次拿多张而不是一次拿一张。#include<map> #include<queue> #include<cmath> #include<cctype> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define qread(x) x=read() #define mes(x,y) memset(x,y,sizeof(x)) #define mpy(x,y) memcpy(x,y,sizeof(x)) #define Maxn 20 #define INF 2147483647 #define eps 1e-6 inline int read(){ char ch=getchar(); int f=1,x=0; while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();} return x*f; } struct Money{ int x,y; }M[Maxn+1]; bool Moneycmp(const Money A,const Money B){ if(A.x>B.x)return true; else return false; } int n,c,ans; int main(){ qread(n);qread(c); for(int i=1;i<=n;i++){ qread(M[i].x);qread(M[i].y); } std::sort(M+1,M+n+1,Moneycmp); ans=0; int sum,t; for(int i=1;i<=n;i++){ while(M[i].y>0){ sum=M[i].x; M[i].y--; t=1; while(t<=n){ while(M[t].y>0&&sum+M[t].x<=c){ sum+=M[t].x; M[t].y--; } t++; } if(sum<c){ t=n; while(t>0){ while(M[t].y>0&&sum<c){ sum+=M[t].x; M[t].y--; } t--; } } if(sum>=c)ans++; } } printf("%d\n",ans); }【USACO月赛】分期付款。。。
不是贪心的下次做完专题先,大家初赛加油
查看原文:http://hz2016.tk/blog/?p=74
【USACO月赛】贪心
最新推荐文章于 2021-01-11 17:51:17 发布