2020/10/2 19級training 補題報告
阿新 • • 發佈:2020-10-11
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,0View Code,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 }
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