传送门
这场div3全都是模拟暴力题,第一次打到E1题,E2我tle了后面再补把,a.a
看见t神22分钟ak
文章目录
A.Candies and Two Sisters
题意:输出一个n,把n分成a和b两个数,且保证a>b
题解:这个真的太水了,就不给代码了,答案就是(n-1)/2,
B.Construct the String
题意:输入n a b,构造一个长度为n的字符串,保证每长a的子串中有b个不同的字母
题解:那就先构造一个长度为b且b个不同字母的子串,然后再加上a-b个相同的字母,这就是构造了一个长度为a且符合条件的子串,再判断n个大小不断再+第一个符合的字符串就行了
注意:输出的时候是输出n个字符
#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--)
{
int n,a,b;
cin>>n>>a>>b;
string s="";
for(int i=0;i<b;i++)
{
s+=char(i+'a');
}
for(int i=b;i<a;i++)
{
s+='a';
}
string ans="";
while(ans.size()<n)
ans+=s;
for(int i=0;i<n;i++)
cout<<ans[i];
cout<<'\n';
}
}
C.Two Teams Composing
题意:输入一个长为n的数组,把这个数组分为两个子数组,一个数组a保证元素全部相同,另外一个数组b保证元素全部不同,且两个数组长度相同,求这长度最大值
题解:记录找出同个元素出现最大次数mx和不同元素的个数num,分别考虑出现最多次的元素是否在数组b中,求两者的最大值,即max(min(mx-1,num),min(mx,num-1))
#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int MAX=1e6+7;
ll a[MAX];
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
a[i]=0;
ll mx = -inf,x,num = 0; //num:不同元素的个数
for(int i=0;i<n;i++) //maxx:同个元素出现的最大次数
{
cin>>x;
++a[x];
}
for(int i=1;i<=n;i++)
{
mx = max(a[i],mx);
if(a[i]!=0)++num;
}
int ans = max(min(num-1,mx),min(num,mx-1));
cout<<ans<<endl;
}
}
D.Anti-Sudoku
题意:输入一个9*9的数组,最可以更改9次,保证每行每列和每个九宫格里面至少有连个相同的数字
题目已经说明肯定有答案
题解:先开始以为是dp,但是想了想是div3,就可以知道,只需要把某一个数字全部都转化成同一个数字,就可以保证条件满足
注意:样例是一次输入9个数字,没有空格,可以转化成字符串处理
#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define ll long long
using namespace std ;
int dp[10][10];
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
string s;
for(int i=0;i<9;i++)
{
cin>>s;
for(int j=0;j<9;j++)
{
dp[i][j]=int(s[j]-'0');
}
}
int k=1;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(dp[i][j]==2)
{
dp[i][j]=1;
}
}
}
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
cout<<dp[i][j];
}
cout<<'\n';
}
cout<<'\n';
}
}
E1.Three Blocks Palindrome (easy version)
卡了我一个钟,a.a
题解:暴力枚举
就枚举开头/结尾的数字以及长度,这总共复杂度是O(n),这样你知道中间一段是个区间,枚举中间一段是哪个数字,前缀和处理之后做到O(1),总复杂度就是O(200n)
在这里插入代码片