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;
}
View Code

 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;
}
View Code

 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;
}
View Code

 

posted @ 2021-02-23 22:49  Endeavo_r  阅读(65)  评论(0)    收藏  举报