---恢复内容开始---
A. USB Flash Drives
水题,排序即可
int a[1111]; int main() { int n,m; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&a[i]); int ans=0; sort(a,a+n); for(int i=n-1;m>0;i--) ans++,m-=a[i]; cout<<ans<<endl; }
B. The Best Gift
本来以为要缩点,结果m<10,具体看代码
int x,n,m,b[11]; ll sum; int main() { memset(b,0,sizeof(b)); sum=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&x),b[x]++,sum++; ll ans=0; for(int i=1;i<=m;i++) { sum-=b[i]; ans+=sum*b[i]; } cout<<ans<<endl; }
C. Load Balancing
依旧是水题。。
typedef long long ll; int a[111111]; int main() { ll ans=0,sum=0; int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]),sum+=a[i]; sort(a,a+n); ll sa=sum/n+1,sb=sum/n; int na=sum%n,nb=n-sum%n; //cout<<na<<nb<<sa<<sb<<endl; for(int i=0;i<n;i++) { if(nb&&a[i]<=sb) nb--,ans+=sb-a[i]; else if(na&&a[i]<=sa) na--,ans+=sa-a[i]; } cout<<ans<<endl; }
D. Gadgets for dollars and pounds
题目读起来很麻烦,而且刚开始还理解错题意了。。以为每件物品既可以用英镑支付又可以用美金支付,
写完才发现样例过不了。
题目一看就是二分,第一反应以为要使用RMQ,后来发现不用也行。
首先把用美金和英镑的分开并排序,然后对于天数二分,在天数区间内遍历
得到最低美金兑换的日子,和英镑的日子,然后比较后选择话费最少burles的gadget购买
typedef long long ll; typedef pair<int,int> pii ; #define N 200089 #define M 400009 #define f0(i,n) for(int i=0;i<(n);i++) #define ff(i,n) for(int i=1;i<=(n);i++) #define p_b push_back #define m_p make_pair #define Abs(a) (a)<0?-(a):(a) #define Clr(a) memset(a,0,sizeof(a)) #define MID(a,b) (a+((b-a)>>1)) #define Lbit(a) (x)&(-(x)) #define X first #define Y second const ll INF=1LL<<60-1; const int lim=1<<25+1; int n,m,k,s; int a[N],b[N]; vector<pii> d,p; vector<pii> ans,tans; int judge(int day) { tans.clear(); int d0=1,d1=1; for(int i=1;i<=day;i++) { if(a[i]<a[d0]) d0=i; if(b[i]<b[d1]) d1=i; } int cnt=k,pd=0,pp=0; ll sb=s; while(cnt) { ll vd=INF,vp=INF; if(pd<d.size()) vd=1LL*a[d0]*d[pd].X; if(pp<p.size()) vp=1LL*b[d1]*p[pp].X; if(vd<vp) { //ans[d[pd].Y]=d0; tans.p_b(m_p(d[pd].Y,d0)); cnt--; sb-=vd; pd++; } else { //ans[p[pp].Y]=d1; tans.p_b(m_p(p[pp].Y,d1)); cnt--; sb-=vp; pp++; } } // cout<<day<<" "<<sb<<" "<<cnt<<endl; if(sb>=0) { ans=tans; return 1; } return 0; } bool cmp(pii c1,pii c2) { return c1.X<c2.X; } int main() { int x,y,z; cin>>n>>m>>k>>s; d.clear(); p.clear(); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); if(x==1) d.p_b(m_p(y,i)); else p.p_b(m_p(y,i)); } sort(d.begin(),d.end(),cmp); sort(p.begin(),p.end(),cmp); int l=1,r=n,mid,res,flag=0; while(l<=r) { mid=(l+r)>>1; if(judge(mid)) { flag=1; res=mid; r=mid-1; } else l=mid+1; //cout<<l<<" "<<r<<endl; } if(flag) { printf("%d\n",res); for(int i=0;i<ans.size();i++) printf("%d %d\n",ans[i].X,ans[i].Y); } else puts("-1"); return 0; }
---恢复内容结束---
时间: 2024-11-07 12:46:33