2020牛客寒假演算法訓練營第二場題解(持續更新中)
阿新 • • 發佈:2020-07-24
貪心,最多贏多少場只要保證儘可能贏就行了,即石頭對應剪刀,剪刀對應布,布對應石頭。
#include<iostream> #include<cmath> using namespace std; int main() { long long a,b,c,x,y,z; cin>>a>>b>>c>>x>>y>>z; long long ans=0; ans+=min(a,y); ans+=min(b,z); ans+=min(c,x); coutView Code<<ans<<endl; return 0; }
題意為給一串數字可以隨意打亂保證616字串的數量最多,那麼首先我們統計數串中1和6的個數,其他的數字均沒有用,題目就轉換成了給定數量的1和6,要組合成子串616最多的字串。
只需要比較6和1的數量即可,分為1的數量>=6的數量-1和1的數量<=6的數量-1兩種情況考慮即可
#include <iostream> #include <cstring> #include <string> #include <algorithm> #includeView Code<queue> #include <stack> #include <stdio.h> #include <cmath> #include <string.h> using namespace std; #define ll long long static const int WHITE=0; static const int GRAY=1; static const int BLACK=2; static const int INF=0x3f3f3f3f; ll Pow(ll a,ll b,ll mod){if(b==0) return1%mod; ll sum=1; a=a%mod; while(b>0) { if(b%2==1) sum=(sum*a)%mod; b/=2; a=(a*a)%mod;}return sum;} int main() { //freopen("C:\\Users\\16599\\Desktop\\in.txt","r",stdin); int s,a,b; string str; a=0;b=0; cin>>s; cin>>str; for(int i=0;i<s;i++) { if(str[i]=='1') a++; if(str[i]=='6') b++; } if(b<2){cout<<"0"<<endl;return 0;} if(a>=b-1){cout<<b-1<<endl;return 0;} else{cout<<a<<endl;} return 0; }
這一題單獨作為一篇部落格來說明
題意為判斷有多少個三元組(i,j,k)滿足i*j<=n並且√i+√j=√k。
我們把兩邊同時開平方可以得到i+j+2√(ij)=k,若要滿足i,j,k均為整數,只需要滿足i*j為完全平方數即可。
所以我們要列舉小於n的所有完全平方數,再對找它的因子就可以了。
#include <iostream> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <stack> #include <stdio.h> #include <cmath> #include <string.h> using namespace std; #define ll long long static const int WHITE=0; static const int GRAY=1; static const int BLACK=2; static const int INF=0x3f3f3f3f; ll Pow(ll a,ll b,ll mod){if(b==0) return 1%mod; ll sum=1; a=a%mod; while(b>0) { if(b%2==1) sum=(sum*a)%mod; b/=2; a=(a*a)%mod;}return sum;} vector <int> vec; int main() { //freopen("C:\\Users\\16599\\Desktop\\in.txt","r",stdin); int n; cin>>n; int ans=0; for(int i=1;;i++) { if(i*i<=n) vec.push_back(i*i); else break; } for(int i=0;i<vec.size();i++) { int cnt=0; for(int j=1;j<=sqrt(vec[i]);j++) { if(vec[i]%j==0) cnt++; } ans+=cnt*2-1; } cout<<ans<<endl; return 0; }View Code