牛客小白月赛110
智乃办赛
思路:水题一个纯模拟就可以了,我们让n/500确定前面的字母,然后n%500确定后面的数字
#include <iostream>
#include <iomanip>
int main() {
int n;
std::cin >> n;
char letter = 'A' + (n - 1) / 500;
int number = (n - 1) % 500 + 1;
std::cout << letter << std::setfill('0') << std::setw(3) << number << std::endl;
return 0;
}
智乃的Wordle
思路:这题一开始没看懂干嘛,愣了一会儿,后来就发现,其实就是给你两个字符串,第一个表示后台的单词,第二个是你当前的单词,如果当前位置,你的单词和你后台的单词一样就是g(绿色),如果当前位置,你的单词不为后台的单词,但是后台单词出现过你这个字符,那就是y(黄色)
否则就是r(红色)
如果全是g,那么就是祝贺,否则就是失败
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,k;
int a[200005];
string s,str;
map<char,int> mp;
void solve()
{
cin>>s;
for(int i=0;i<8;i++)
{
mp[s[i]]=1;
}
cin>>str;
string ans="";
int flag=1;
for(int i=0;i<8;i++)
{
if(str[i]==s[i])
{
ans+="g";
}
else if(str[i]!=s[i]&&mp[str[i]]==1)
{
flag=0;
ans+="y";
}
else
{
flag=0;
ans+="r";
}
}
cout<<ans<<"\n";
if(flag==1)
{
cout<<"congratulations\n";
}
else
{
cout<<"defeat\n";
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
t=1;
while(t--)
solve();
return 0;
}
智乃的数字
思路:自己在纸上手玩一下,很快就能发现规律
3 9 15 21 27 33 39 45 51 57 63 69 75
5 15 25 35 45 55 65 75
我们会发现,其实从21以后就开始有规律了,我们在每两个重合的位置穿插6个数,也就说明每30个出现一次重复的,因此我们就可以抽出来前11项,如果在前11项,直接选取n,否则就是先-4,然后除7,取模7确定位置,然后*30就可以解决了
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,k;
int a[15]={0,3,5,9,15,21,25,27,33,35,39,45};
string s;
void solve()
{
cin>>n;
if(n<=11)
{
cout<<a[n]<<"\n";
}
else
{
n-=4;
int pos=n/7;
int mod=n%7;
if(mod==0)
{
pos-=1;
mod=7;
}
cout<<pos*30+a[4+mod]<<"\n";
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--)
solve();
return 0;
}
智乃与长短期主义者博弈
思路:其实就是一个简单的区间dp问题,我们的dp方程式表示的含义是dp[l][r]表示的是从L到R这个区间内的,长期主义者和短期主义者的得分差值,因为都会让自己的评分最大化,但是短期主义者套路固定,因此我们可以先求出长期主义者的最大值,然后用sum-长期主义者的分就是短期主义者的分
我们可以用记忆化搜索来逐层搜索,
我们分四种情况
第一种L==R,那么我们的dp[l][r]肯定就是-a[l]了,因为短期主义者先选
第二种L+1==R,那么dp[l][r]=min(a[l],a[r])-max(a[l],a[r])
第三种a[l]<a[r],那么dp[l][r]=max(a[l+1]-a[l]+dfs(l+2,r),a[r]-a[l]+dfs(l+1,r-1));
第四种,也就也是剩余的情况, dp[l][r]=max(a[l]-a[r]+dfs(l+1,r-1),a[r-1]-a[r]+dfs(l,r-2));
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,k;
int a[1005];
int dp[1005][1005];
int sum=0;
int cha=-1e12;
int solve(int l,int r)
{
if(dp[l][r]!=-1e12)
{
return dp[l][r];
}
if(l==r)
{
return dp[l][r]=-a[l];
}
else if(l+1==r)
{
return dp[l][r]=min(a[l],a[r])-max(a[l],a[r]);
}
else if(a[l]>=a[r])
{
return dp[l][r]=max(a[l+1]-a[l]+solve(l+2,r),a[r]-a[l]+solve(l+1,r-1));
}
else
{
return dp[l][r]=max(a[l]-a[r]+solve(l+1,r-1),a[r-1]-a[r]+solve(l,r-2));
}
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dp[i][j]=-1e12;
}
}
cha=solve(1,n);
cout<<(sum-cha)/2<<" "<<sum-(sum-cha)/2;
return 0;
}