1. 程式人生 > 實用技巧 >QFNU 10-02 19 training 補題

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杯咖啡,每杯咖啡都要在一天特定的時間喝掉,如果兩杯咖啡在一天喝,那麼它們之間至少要相隔dmin,要求輸出最少幾天可以喝完,並輸出對應題目輸入的每一杯咖啡是在第幾天喝的

#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;
    
}