1. 程式人生 > 實用技巧 >2020/10/2 19級training 補題報告

2020/10/2 19級training 補題報告

B. Yet Another Crosses Problem

https://codeforces.com/contest/1194/problem/B

題意:給q個測試樣例,每個樣例給一個由黑白色格子組成的圖,如果某一個格子所在的行和列全被塗黑,則構成一個十字架,求構成一個十字架最少需要把多少白色格子塗黑(*表示黑色,.表示白色);

題解:分別用兩個陣列記錄每行每列的 白色格子數,迴圈找出行 h[i] 和 列 l[j] 中白色格子和最少的,如果s[i][j]== ' . ' 還要減一。(第一遍做的時候我是是單獨找的行和列中黑色格子的最大值再求,全是白色格子的情況判斷就會出錯。後來一直超時,是因為把string s[50010]定義在迴圈裡了)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 typedef long long ll;
 8 int h[50010],l[50010];
 9 int main(){
10     string s[50010];
11     int q;
12     cin>>q;
13     while(q--){
14         memset(h,0
,sizeof(h)); 15 memset(l,0,sizeof(l)); 16 int n,m,minn=1000000; 17 cin>>n>>m; 18 for(int i=0;i<n;i++){ 19 cin>>s[i]; 20 for(int j=0;j<m;j++){ 21 if(s[i][j]=='.'){ 22 h[i]++; 23 }
24 } 25 } 26 for(int i=0;i<m;i++){ 27 for(int j=0;j<n;j++){ 28 if(s[j][i]=='.'){ 29 l[i]++; 30 } 31 } 32 } 33 int flag=0; 34 for(int i=0;i<n;i++){ 35 for(int j=0;j<m;j++){ 36 if(s[i][j]=='.'){ 37 flag=-1; 38 }else{ 39 flag=0; 40 } 41 minn=min(h[i]+l[j]+flag,minn); 42 } 43 } 44 cout<<minn<<endl; 45 } 46 return 0; 47 }
View Code

C. From S To T

https://codeforces.com/contest/1194/problem/C

題意:給字串s,t,p,你可以從p中拿出任意字元插到字串s的任意位置,判斷能否使字串s變成字串t;

題解:判斷字串s是否使字串t的子序列,判斷p中的字元能否使字串s變成字串t

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
bool check(string s,string t){
    int p=0;
    for(int i=0;i<t.length();i++){
        for(int j=p;j<s.length();j++){
             if(t[i]==s[j]){
                 p=j+1;
                 break;
             }else{
                 break;
             }
        }

    }
        if(p==s.length()){
            return 1;
        }else{
            return 0;
        }
}
int main(){
    int q,a[27];
    cin>>q;
    while(q--){
        memset(a,0,sizeof(a));
        int k=0;
        string s,t,p;
        cin>>s>>t>>p;
        int flag1=check(s,t);
        if(!flag1){
            cout<<"NO"<<endl;
        }else{
            for(int i=0;i<p.length();i++){
                a[p[i]-'a']++;
            }
            for(int i=0;i<s.length();i++){
                a[s[i]-'a']++;
            }
            for(int i=0;i<t.length();i++){
                a[t[i]-'a']--;
            }
            int flag2=1;
            for(int i=0;i<26;i++){
                if(a[i]<0){
                    flag2=0;
                    break;
                }
            }
            if(flag2){
                cout<<"YES"<<endl;
            }else{
                cout<<"NO"<<endl;
            }
        }
    }
        return 0;
}
View Code

B. Buying a TV Set

https://codeforces.com/contest/1041/problem/B

題意:有一商場有多種電視機,它們的寬不超過a,高不超過b。Monocarp 想買一臺電視機,但是要求寬高比滿足x/y;給a,b,x,y判斷有多少,求有多少電視機滿足;

題解:找到x/y的最簡比x0/y0,找a/x0和b/y0中最小的那個

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
ll gcd(ll x,ll y){
    return y?gcd(y,x%y):x;
}
int main(){
    ll a,b,x,y;
    cin>>a>>b>>x>>y;
    ll temp=gcd(x,y);
    x=x/temp,y=y/temp;
    cout<<min(a/x,b/y)<<endl;
    return 0;
}
View Code