1. 程式人生 > 實用技巧 >2020牛客寒假演算法訓練營第二場題解(持續更新中)

2020牛客寒假演算法訓練營第二場題解(持續更新中)

A做遊戲

貪心,最多贏多少場只要保證儘可能贏就行了,即石頭對應剪刀,剪刀對應布,布對應石頭。

#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);
    cout
<<ans<<endl; return 0; }
View Code

B排數字

題意為給一串數字可以隨意打亂保證616字串的數量最多,那麼首先我們統計數串中1和6的個數,其他的數字均沒有用,題目就轉換成了給定數量的1和6,要組合成子串616最多的字串。

只需要比較6和1的數量即可,分為1的數量>=6的數量-1和1的數量<=6的數量-1兩種情況考慮即可

#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;} 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; }
View Code

D數三角

這一題單獨作為一篇部落格來說明

E做計數

題意為判斷有多少個三元組(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