10.02补题报告

题目:From S To T

题目大意:

给出 t 组测试样例,对于每组测试样例:给出三个字符串 s1,s2,s3 ,你可以 s3 中的字符串一个一个的拿走放入s1中,问能否组成s2 (当时直接读错题,最下面的解释也没看见,以为是把s3删掉一些字符后再把s3插入s1中)

思路:

分别记录三个字符串里面字母的给数情况,然后对s2内的字符进行遍历,先看能不能来自 s1,并且要记录有多少能够来自s1的字符,找不到再去s3找,因为s3是选择插入s1的所以不用再记录个数,最后看看我们记录的来自s1的字符数量是不是与s1的长度一样。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e5 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)


int main()
{
    int t;
    string s1,s2,s3;
    cin >> t;
    while(t--){
        int a[30],b[30],c[30];
        cin>>s1;
        cin>>s2;
        cin>>s3;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        for(int i=0;i<s1.length();i++){
            a[s1[i]-'a']++;
        }
        for(int i=0;i<s2.length();i++){
            b[s2[i]-'a']++;
        }
        for(int i=0;i<s3.length();i++){
            c[s3[i]-'a']++;
        }
        int flag=1;
        int j=0;
        for(int i=0;i<s2.length();i++){
            if(s1[j]!=s2[i]){
                if(c[s2[i]-'a']==0){
                    flag=0;
                }
                else{
                    c[s2[i]-'a']--;
                }
            }
            else{
                j++;
            }
        }
        if(j!=s1.length()){
            flag=0;
        }
        if(flag){
            cout<<"YES"<<endl;
        }
        else{
            cout<<"NO"<<endl;
        }
    }
    return 0;
}

题目:Yet Another Crosses Problem

题目大意:

给出 t 组测试样例,对于每组测试样例:给出一个一个n*m 的方格,问能让星号组成十字的最小改变次数(每一次你可以将一个 ' . ' 变成 ’ * ‘)。

思路:

读完题,肯定想到找那个星号最多的行与列,再特判一下中心点,一开始我是直接找的星号最多的行号与列号,然后就WA了,这个题要想到它的星号最多的行与可能有多行,所以就应该先开俩数组,遍历记录行列星号个数,最后再遍历一遍中心点不断更新最小值。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e5 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)
string s[50010];
int numhang[50010],numlie[50010];

int main()
{
    int t;
    cin >> t;
    while(t--){
        memset(numhang,0,sizeof(numhang));
        memset(numlie,0,sizeof(numlie));
        int n,m,point = 0,maxnum = 0;
        cin >> n >> m;
        for(int i = 0;i < n;i++)
            cin >> s[i];
        for(int i = 0;i < n;i++){
            int num = 0;
            for(int j = 0;j < m;j++){
                if(s[i][j] == '*'){
                    numhang[i]++;
                    numlie[j]++;
                }

            }

        }
        ll sum = INF;
        for(int i = 0;i < n;i++){
            for(int j = 0;j < m;j++){
                int sign = 0;
                if(s[i][j] == '.')
                    sign = -1;

                sum = min((ll)(m - numlie[j] + n - numhang[i] + sign),sum);
            }
        }

      
        cout << sum << endl;

    }
    return 0;
}

题目:Buying a TV Set

题目大意:

给出a,b,x,y让你找出符合w(w <= a) ,h( h <= b) 的对数,使得 w与h 的比值与 x ,y的比值一样。

思路:

这题就是先算一下x,y的最大公约数,化简一下x/y ,然后我当时奇葩的脑回路先想到的用循环,这肯定是要WA的,其实答案就是min(a / x , b / y)。 

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e5 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)

int main()
{
    ios::sync_with_stdio(false);


    ll a,b,x,y;
    cin >> a >> b >> x >> y;
    ll m = __gcd(x,y);
    x = x/m;
    y = y/m;

    cout << min(a/x,b/y) << endl;

    return 0;
}

 

posted @ 2020-10-03 11:19  emhhbw==  阅读(137)  评论(0)    收藏  举报