QFNU-ACM 2021.2.17 Rating
A - A
题意:就是求从最小的数到最大的数中间缺了几个数
#include<algorithm> #include<iostream> #include<cstdio> #include<cmath> using namespace std; int a[1010]; int main(){ int n; int x; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); x=a[0]+1; int sum=0; for(int i=1;i<n;){ if(a[i]==x){ i++; x++; }else{ sum++; x++; } } cout<<sum<<endl; return 0; }
B - B
题意:给a,b,x,y, 使w<=a,h<=b且w/h=x/y,判断有几组w,h 满足条件
题解:求出x/y的最简比 ,x*/y*,然后取a/x*,b/y*中的最小值
#include<algorithm> #include<iostream> #include<cstdio> #include<cmath> using namespace std; typedef long long ll; ll gcd(ll a,ll b){ if(b==0){ return a; } return gcd(b,a%b); } int main(){ ll a,b,x,y,t; cin>>a>>b>>x>>y; t=gcd(x,y); x=x/t; y=y/t; ll ans=0; ans=min(a/x,b/y); cout<<ans<<endl; return 0; }
C.Coffee Break
题意:给n,m,d; 还有n个数a1,a2,....an;表示Monocarp想要在特定的时刻喝咖啡:有n分钟a1,a2,…,an;Monocarp的工作时间是m分钟。同一天两次喝咖啡之间至少隔了d分钟,求最少的天数喝完这n个特定时刻的咖啡
题解:第一天从最早时刻的咖啡ai开始,则下一杯咖啡是大于ai + d 的第一个数,并将已经喝掉的咖啡删除;如果没有这个数则进入下一天,从最小时刻的喝
if(is==s.end()){ break; }else{ mp[*is]=sum; ans+=d; s.erase(is); }
第二遍改成d+1还是错了,重新审题,是间隔大于等于d
if(is==s.end()){ break; }else{ mp[*is]=sum; ans+=d+1; s.erase(is); }
最后的正确代码:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<set> #include<map> using namespace std; #define MAXN 200010 int a[MAXN]; set<int>s; set<int>::iterator it,is,it1; map<int,int>mp; int main(){ int n,m,d,x; cin>>n>>m>>d; for(int i=1;i<=n;i++){ cin>>a[i]; s.insert(a[i]); } int sum=0,ans=0; for(it=s.begin();it!=s.end();it++){ sum++; mp[*it]=sum; it1=it; while(1){ is=s.upper_bound(*it1+d); if(is==s.end()){ break; }else{ mp[*is]=sum; it1=is; s.erase(is); } } /* sum++; mp[*it]=sum; ans=*it; while(1){ is=s.upper_bound(ans+d); if(is==s.end()){ break; }else{ mp[*is]=sum; ans=*is; s.erase(is); } } */ } cout<<sum<<endl; for(int i=1;i<=n;i++){ cout<<mp[a[i]]<<" "; } cout<<endl; return 0; }

浙公网安备 33010602011771号