这次比赛只能用抽象来形容,前五道题都没有什么算法,都是思维加模拟都能过,然后第四题卡住了,第五题不知道为什么做出来的人那么少,就是纯暴力就能过,但是没抓住上分的机会,有些可惜,但是还好打完比赛把第四个重新补出来了,感觉大模拟的题还是不太擅长,以后可以练习一下
话不多说,直接看题
A. Only Pluses
题意:就是给你三个数,三个数一共可以增加的次数为5,问你增加完之后,其三个数的乘积最大值为多少
思路:思路就是小学数学题,但是因为实现有问题,也是卡了我20分钟,我就知道这次比赛直接白搭
每次选取出来三个数里面最小的一个加上1就可以
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int a,b,c;
int solve(int a,int b,int c)
{
return min(min(b,c),a);
}
signed main()
{
cin>>t;
while(t--)
{
cin>>a>>b>>c;
for(int i=1;i<=5;i++)
{
int flag=solve(a,b,c);
if(a==flag)
{
a++;
continue;
}
else if(b==flag)
{
b++;
continue;
}
else if(c==flag)
{
c++;
continue;
}
}
cout<<a*b*c<<"\n";
}
return 0;
}
B. Angry Monk
题意:就是说每次操作只能将一块蛋糕分成1和w-1或者将一个重量为w,另一个重量为1的拼起来
思路:很明显就能想到,除了最大的一块外,别的都是分割操作w-1次,拼接操作w次,因此就可以直接写出来了
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,k;
int a[100005];
signed main()
{
cin>>t;
while(t--)
{
int maxn=0;
int flag=0;
cin>>n>>k;
int ans=0;
for(int i=1;i<=k;i++)
{
cin>>a[i];
if(a[i]>maxn)
{
maxn=a[i];
flag=i;
}
}
for(int i=1;i<=k;i++)
{
if(i==flag)
continue;
ans+=a[i]*2-1;
}
cout<<ans<<"\n";
}
return 0;
}
C. Gorilla and Permutation
题意:给你一个n,m,k,然后f函数里面是前i个数里面不小于k的值的和,因此前面就从大到小倒着来就可以,然后当轮到倒数第m个后,要从前往后来,确保前面的数更小,累加值更大
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,m,k;
int a[100005];
signed main()
{
cin>>t;
while(t--)
{
cin>>n>>m>>k;
for(int i=n;i>=m+1;i--)
{
a[i]=i;
}
for(int i=1;i<=m;i++)
{
a[i]=m-i+1;
}
for(int i=n;i>=1;i--)
{
cout<<a[i]<<" ";
}
cout<<"\n";
}
return 0;
}
D. Test of Love
纯模拟的题,一开始忘了区分当前位置在水里还是在木头上,错了好几次,后面打完比赛也是想到这个问题了,后面才改对的
pair<int,int> old,第一个数存的是当前位置的下标,第二个存的是当前在水里还是在木头上
如果木头上,我们需要判断下一个木头距离当前位置的的距离,如果小于m则直接更新old的first即可,然后如果大于m,则需要判断当前位置+m后在哪里,如果是鳄鱼,那么肯定是no
如果是水,判断水和下一个木头的位置,如果中间存在鳄鱼,那么也是不可能的,如果没有鳄鱼,则需要判断如果游泳,会不会超过k,如果总游泳没有超过k,则可以,更新old的first和second即可
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,m,k;
char s[200005];
int sum=0;
int ans=0;
void solve()
{
sum=0;//在水中游的距离
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
if(m>n)
{
cout<<"YES\n";
return;
}
s[n+1]='L';
pair<int,int> old;
old.first=0;
old.second=0;
for(int i=1;i<=n+1;i++)
{
if(s[i]=='L'&&old.second==0)//现在位置在陆地上
{
if(i-old.first<=m)
{
old.first=i;
old.second=0;
continue;
}
else
{
if(s[old.first+m]=='C')
{
cout<<"NO\n";
return ;
}
else
{
old.first+=m;
old.second=1;
i--;
}
}
}
if(s[i]=='L'&&old.second==1)
{
for(int j=old.first;j<i;j++)
{
if(s[j]=='C')
{
cout<<"NO\n";
return;
}
sum++;
if(sum>k)
{
cout<<"NO\n";
return ;
}
}
old.first=i;
old.second=0;
}
}
cout<<"YES\n";
return ;
}
signed main()
{
cin>>t;
while(t--)
{
solve();
}
return 0;
}
E. Novice's Mistake
题意:就是说你一个字符串乘以一个数等于a个n链接在一起,减去一个数,就相当于减去一部分,如果减的太多了,那字符串没了,直接就是0
思路:这题数据很小纯暴力就能过
首先可以说明,对于100这个数据,无论你选什么数,你都无法正确得出结果,因此为0个解,直接输出0即可
对于别的数,再分是否小于10,和大于10就行(太困了,明天再补全)
#include <bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n;
int jie()
{
cin>>n;
if(n == 100)
return 3;
vector<pair<int, int>> ans;
if(n<10)
{
for(int a = 1; a <= 10000; a++)
{
for(int b = max(1LL, a - 6); b < a; b++)
{
int res = n * a - b;
bool flag = true;
for(int i = 1; i <= a - b; i++)
{
if(res % 10 != n) flag = false;
res /= 10;
}
if(res)
flag = false;
if(flag)
ans.emplace_back(a, b);
}
}
}
else
{
for(int a = 1; a <= 10000; a++)
{
for(int b = max(1LL, a + a - 6); b < a + a; b++)
{
int res = n * a - b;
bool flag = true;
for(int i = 1; i <= a + a - b; i++)
{
if((i + b) & 1)
{
if(res % 10 != n % 10)
flag = false;
} else
{
if(res % 10 != n / 10)
flag = false;
}
res /= 10;
}
if(res!=0)
flag = false;
if(flag)
ans.emplace_back(a, b);
}
}
}
cout<<ans.size()<<"\n";
for(int i = 0; i<ans.size();i++)
{
cout<<ans[i].first<<" "<<ans[i].second<<'\n';
}
return 0;
}
signed main() {
cin>>t;
while(t--)
{
int d=jie();
if(d==3)
{
cout<<"0\n";
}
}
return 0;
}