題目列表
- A - Maliang Learning Painting
- C - Liar
- G - Multiples of 5
- H - Convolution
- J - Magic Mahjong
- K - Magic Tree
A - Maliang Learning Painting
題目來源:A - Maliang Learning Painting
思路分析
這是個簽到題,直接輸出a+b+c即可
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{int a,b,c;cin>>a>>b>>c;cout<<a+b+c;return 0;
}
C - Liar
題目來源:C - Liar
思路分析
這道題非常巧妙,用到貪心的思想,因為ai可正可負可為0,我們可以從兩方面考慮:
- 如果所有數的和加起來等于s,那么所有人說的都是真話,輸出n。
-
- 如果不等于s,我們只需要把其中一個數變成使它和剩下的數相加等于s的數即可,輸出n-1。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,s,a[N],sum;void solve()
{cin>>n>>s;for(int i=1;i<=n;i++)cin>>a[i],sum+=a[i];if(sum==s)cout<<n;elsecout<<n-1;
}
signed main()
{int _=1;
// cin>>_;while(_--)solve();return 0;
}
G - Multiples of 5
題目來源:G - Multiples of 5
思路分析
這道題我們的目的是為了算出這個-11數制對應的十進制數能否被5整除。
但是題目范圍很大,這個數的長度就有 1 0 1 4 10^14 1014,顯然,如果硬生生轉化再存入一個數中是要超出范圍的。
那么就要想一個優化的方法,我們不難想出,11的任何次冪個位數一定是1,我們只要把轉換過程中每個位數上的數,乘以11的位數減一次方的個位數相加,也就是(比如說x個y,直接累加上x*y),最終再判斷這個數能否被5 整除即可,但是要注意如果-11數制下是’A’,要轉換成10來計算。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,x,sum;
char c;
void solve()
{cin>>n;sum=0;//sum一定要初始化!!!for(int i=1;i<=n;i++){cin>>x>>c;if(c=='A')sum+=x*10;elsesum+=x*(c-'0');}if(sum%5==0)cout<<"Yes"<<endl;elsecout<<"No"<<endl;
}
signed main()
{int _=1;cin>>_;while(_--)solve();return 0;
}
H - Convolution
題目來源:H - Convolution
思路分析
我認為這道題有點難度,仔細讀題我們可以發現,矩陣K的值,如果用貪心的思想,在對應的原矩陣中要求的子矩陣的前綴和,如果和為負k對應值取負,同理何為正就取正和為零就取零。
因此我們不必多慮K矩陣中的值,因為K矩陣對應的原矩陣中的值相乘的值等于O矩陣的值只需要算出對應原矩陣中前綴和的絕對值相加就是O矩陣所有元素之和最大的值。
因為輸入輸出較多所以建議用iOS優化
這里一定要會運用前綴和的思想,不懂的可以先看我的這篇博客:前綴和與差分【入門】原理+例題
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define int long long
using namespace std;
const int N=1e3+1;
int n,m,k,l,a[N][N],s[N][N];
void solve()
{cin>>n>>m>>k>>l;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];s[i][j]=s[i-1][j]+s[i][j-1]+a[i][j]-s[i-1][j-1];}}int x=n-k+1,y=m-l+1,sum=0;for(int i=x;i<=n;i++){for(int j=y;j<=m;j++){sum+=abs(s[i][j]-s[i-x][j]-s[i][j-y]+s[i-x][j-y]);}}cout<<sum;}
signed main()
{IOS;int _=1;
// cin>>_;while(_--)solve();return 0;
}
J - Magic Mahjong
題目來源:J - Magic Mahjong
思路分析
這是一道簡單的模擬題,我們只需要讀懂題意。
這里的意思是在所有的麻將牌中,最初有14張牌組成,看這14張牌,
- 如果包括所有的字牌和幺九牌,并且額外重復其中任意一張牌,就輸出 Thirteen Orphans.
- -如果有7對牌就輸出 7 Pairs.
- 如果上述條件都不滿足,就輸出 Otherwise。
我們可以定義一個map將每一組牌都存進去,然后判斷數量為1的牌有多少個(記為x)和數量為2的牌有多少個(記為y)。 - 如果X=12,Y=1那么有可能符合第一種情況,仍需繼續判斷是否包括所有的字牌和幺九牌,這里可以定義一個字符串數組存入所有的字牌和幺九牌,然后遍歷這個數組,看它其中的每個元素對應的map值是不是都不等于零。
- 如果y=7,那么它就滿足第2種情況。
- 否則直接輸出otherwise。
#include<bits/stdc++.h>
#define int long long
using namespace std;
string s,s1;
map<string,int>mp;
string s2[]={"1p","9p","1s","9s","1m","9m","1z","2z","3z","4z","5z","6z","7z"};
void solve()
{mp.clear();//記得清空mpcin>>s;int ans=0;for(int i=0;i<s.size();i++){ans++;s1+=s[i];if(ans==2){mp[s1]++;ans=0;s1.clear();}}int x=0,y=0;for(auto v:mp){if(v.second==1)x++;if(v.second==2)y++;}int f=0;if(x==12&&y==1){for(int i=0;i<13;i++){if(mp[s2[i]]==0){f=1;break;}}if(!f){cout<<" Thirteen Orphans"<<endl;return ;}}if(y==7){cout<<" 7 Pairs"<<endl;return ;}cout<<" Otherwise"<<endl;
}
signed main()
{int _=1;cin>>_;while(_--)solve();return 0;
}
K - Magic Tree
題目來源:K - Magic Tree
思路分析
這道題就是找規律,通過找前面幾個數的規律我們發現數量s的值是有規律的:
- m=1,s=1= 2 0 2^0 20
- m=2,s=2= 2 1 2^1 21
- m=3,s=4= 2 2 2^2 22
- m=4,s=8= 2 3 2^3 23
- m=n,s=2^(n-1)
因此我們只需要輸出s的值即2的(n-1)次方,主要是這個數會很大該怎么優化取模,可以讓s初始化為1,因為M的范圍是1e5,所以我們可以遍歷從1到m-1每次讓s*2并對998244353 取模再賦值給s,最后輸出s的值即可。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=998244353;void solve()
{int m,sum=1;cin>>m;for(int i=1;i<m;i++){sum=(sum*2)%N;}cout<<sum;
}
signed main()
{int _=1;
// cin>>_;while(_--)solve();return 0;
}
今天的題解就到這里。希望對你有所幫助動動您發財的小手點贊收藏吧 你的鼓勵就是我的動力!!!