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