牛客小白賽7 部分題解
阿新 • • 發佈:2018-12-11
A
就是一個簡單的遞迴;
看懂就ok
#include<iostream>
using namespace std;
int main()
{
long long n;
cin >> n;
if(n < 20180001) cout << n + 2017;
else cout << 20182017 << endl;
return 0;
}
B
SG函式的運用;
f[i]裡面的值可以是1 和 a+1到b+1;
#include <iostream> #include <cstring> #define maxn 100005 typedef long long ll; using namespace std; ll SG[maxn],s[12]; ll f[12]; void sg(int n,int k) { for(int i = 1; i <= n; i++) { memset(s,0,sizeof(s)); for(int j = 0; f[j] <= i && j < k; j ++) { s[SG[i-f[j]]] = 1; } for(int j = 0; ; j ++) { if(!s[j]) { SG[i] = j; break; } } } } int main() { ll t,a,b; cin >> t >> a >> b; ll w = 0; f[w++] = 1; for(int j = a + 1; j <= b + 1; j ++) { f[w++] = j; } sg(t,w); if(SG[t]) cout << "Alice" <<endl; else cout << "Bob" <<endl; return 0; }
C
第一個人的概率就是自己的概率
第二個人是第一個人贏不了的概率乘第二個人贏得概率
#include <bits/stdc++.h> #define maxn 100005 typedef long long ll; using namespace std; int main() { double n,m; cin >> n >> m; n /= 100.0; m /= 100.0; if(n > (1 - n) * m) { cout << "MWH" << endl; } else if(n == (1 - n) * m) { cout << "equal" << endl; } else { cout << "CSL" << endl; } return 0; }
E
模擬就好
#include <bits/stdc++.h> #define maxn 100005 typedef long long ll; using namespace std; int main() { ll n,m; cin >> n >> m; if(m == 1 && n != 1)cout << "No" << endl; else { if(n == 1)cout << "Yes" << endl; else { while(n >= m) { n -= m; n += 1; } if(n == 1)cout << "Yes" << endl; else cout << "No" << endl; } } return 0; }
F
c++選手stl模板
#include <bits/stdc++.h>
#define maxn 100005
typedef long long ll;
using namespace std;
int main()
{
string s;
cin >> s;
for(int i = 0; i <= s.length() ; i ++)
{
if(s[i] >= 'A' && s[i] <= 'Z')
{
s[i] += 32;
}
}
ll f = s.find("bob");
if(f == string::npos)
{
cout << -1 << endl;
}
else
{
cout << f << endl;
}
return 0;
}
G
思路:
01揹包取一半
#include <bits/stdc++.h>
#define maxn 100005
typedef long long ll;
using namespace std;
ll a[maxn];
ll dp[105][maxn];
int main()
{
ios::sync_with_stdio(false);
ll n,s = 0;
cin >> n;
ll m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s+=a[i];
}
m=s/2;
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
{
if(j >= a[i])
{
dp[i][j] = max(dp[i-1][j-a[i]]+a[i],dp[i-1][j]);
}
else
dp[i][j] = dp[i-1][j];
}
}
if(s - dp[n][m] > dp[n][m])
{
cout << dp[n][m] << ' ' << s - dp[n][m] << endl;
}
else
{
cout << s - dp[n][m] << ' ' << dp[n][m] << endl;
}
return 0;
}