QFNU 10-02 19 training 补题

C - From S To T

给一个图,‘.’表示白色,‘*’表示黑色,一次填充使一个白色变成黑色,找出缺少黑色最少的行列

记录每一行,每一列白色的个数,循环找出行列和最小的那一组

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string a[50010];
    int t;
    cin>>t;
    while(t--)
    {
        int h[50010]= {0},l[50010]= {0};
        int n,m,i,j;
        cin>>n>>m;
        for(i=0; i<n; i++)
        {
            cin>>a[i];
            for(j=0; j<m; j++)
            {
                if(a[i][j]=='.')
                {
                    h[i]++;
                }
            }
        }
        for(j=0; j<m; j++)
        {
            for(i=0; i<n; i++)
            {
                if(a[i][j]=='.')
                {
                    l[j]++;
                }
            }
        }
        int ans=0,minn=999999;
        for(i=0;i<n;i++){
            for(j=0;j<m;j++){
                if(a[i][j]=='.')
                {
                    ans=-1;
                }else{
                    ans=0;
                }
                minn=min(h[i]+l[j]+ans,minn);
            }
        }
        cout<<minn<<endl;

    }
}

F - Coffee Break

某人要在n天内喝n杯咖啡,每杯咖啡都要在一天特定的时间喝掉,如果两杯咖啡在一天喝,那么它们之间至少要相隔d min,要求输出最少几天可以喝完,并输出对应题目输入的每一杯咖啡是在第几天喝的

#include <bits/stdc++.h>
using namespace std;
int a[100100],b[100100];
set<pair<int,int> >se;
int main()
{
    int n,m,d,i;
    cin>>n>>m>>d;
    for(i=0;i<n;i++){
        cin>>a[i];
        se.insert(make_pair(a[i],i));
    }
    int cnt=0,pos;
    while(!se.empty()){
        pos =se.begin()->second;
        b[pos]=++cnt;
        se.erase(se.begin());
        while(1){
            auto t=se.lower_bound({a[pos]+d+1,0});
            //lower_bound(begin,end,i)用法是查找排好序的从begin开始到end结束不大于i的数,二分查找方法
            if(t==se.end())
                break;
            pos=t->second;
            b[pos]=cnt;
            se.erase(t);
        }
    }
    cout<<cnt<<endl;
    cout<<b[0];
    for(i=1;i<n;i++){
        cout<<' '<<b[i];
    }
    return 0;
    
}
原文地址:https://www.cnblogs.com/a-specter/p/13767910.html