A. Candies and Two Sisters
姐姐和妹妹分n颗糖,姐姐必须比妹妹的少,问有几种情况,必须每人至少有一颗
//答案:(n-1)/2
B. Construct the String
有n,a,b,长度是n的字符串,构造一个长度为n的字符串,每a个字符串,都有b个不同字母,输出其中一个。
思路:直接按照(i%b+‘a’))构造就行
#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
typedef long long ll;
int main()
{
int T; cin>>T;
while(T--)
{
ll a,b,n; cin>>n>>a>>b;
for(int i=0;i<n;i++)
cout<<((char)(i%b+'a'));
cout<<endl;
}
return 0;
}`
C. Two Teams Composing
有n人,ai代表技能,n个人要分成两个相同数量的组合,第一个组合技能ai值都不同,第二个组合技能ai值都相同,问组合的人数最多是多少
思路:统计每个数字出现的次数并且放入set中,算了直接看代码的,还是比较好理解的
#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
typedef long long ll;
const int N=200010;
int a[N];
int main()
{
int T; cin>>T;
while(T--)
{
map<int,int> mp;
set<int> st;
int n; cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
st.insert(a[i]);
mp[a[i]]++;
}
int ans=0;
for(int i=0;i<n;i++)
{
if(mp[a[i]]>st.size())
ans=max(ans,(int)st.size());
else
ans=max(ans,min(mp[a[i]],(int)st.size()-1));
}
printf("%d\n",ans);
}
return 0;
}
D. Anti-Sudoku
给9 * 9的数独,要求变成每行每列,每3*3的格子出现2个相同数。
思路:这个真的是过分,一开始还以为dfs了,后来才想到把1变成2就行…
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,a[N],b;
int num[N];
char gets(int x)
{
return (char)x%9+1+'0';
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
char s[10][10];
for(int i=1;i<=9;i++)
scanf("%s",s[i]+1);
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
if(s[i][j]=='1')
s[i][j]='2';
for(int i=1;i<=9;i++)
printf("%s\n",s[i]+1);
}
return 0;
}
E1. Three Blocks Palindrome (easy version)
题意就是说,给一串数字,删掉其中的一些,让他变成A B A的回文样子,就像111222111这样的。
思路:总共26个数字,这必须暴力啊…
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2010;
int n,a[N];
int num[N][30];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=26;j++)
num[i][j]=0;
int sum=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
for(int j=1;j<=26;j++)
num[i][j]=num[i-1][j];
num[i][a[i]]++;
sum=max(sum,num[i][a[i]]);
}
for(int i=1;i<=n;i++)
{
for(int j=n;j>i;j--)
{
int res=0;
for(int k=1;k<=26;k++)
res=max(res,num[j-1][k]-num[i][k]);
sum=max(min(num[i][a[i]],num[n][a[i]]-num[j-1][a[i]])*2+res,sum);
}
}
cout<<sum<<endl;
}
return 0;
}