A. Candies and Two Sisters
直接签就行,规律是(n+1)/2-1,
#include<iostream>
typedef long long ll;
using namespace std;
int main()
{
ios::sync_with_stdio(false);
ll t,n;
cin>>t;
while(t--)
{
cin>>n;
cout<<(n+1)/2-1<<endl;
}
return 0;
}
B. Construct the String
在一个长度为n的序列中,找一个长度为a的子序列有b个不同的数字。
先给a-b个位置构造相同的字符,接下来再构造b个不同的字符,,剩下的重复刚才的字符。
#include <bits/stdc++.h>
using namespace std;
char s[2005];
int main()
{
ios::sync_with_stdio(false);
int t,n,a,b;
cin>>t;
while(t--)
{
cin>>n>>a>>b;
int m=a-b;
int k=0;
for(int i=1;i<=m;i++)
s[i]=char(k+'a');
for(int i=m+1;i<=a;i++)
s[i]=char((k++)+'a');
for(int i=a+1;i<=n;i++)
s[i]=s[i-a];
s[n+1]=0;
cout<<s+1<<endl;
}
return 0;
}
C. Two Teams Composing
给n个人,第i个人拥有ai项技能,你需要组建俩支队伍,第一支所有队员的技能都不一样,第二支队员所有的技能都一样,并且第一支队伍的人数需要与第二支队伍的人数相同,请问最多每队能选几个人。
先求出不同的技能一共有多少人为cnt,,用map记录每个技能的人数有多少人,,,
从1~n遍历,如果不同的人数大于相同的,则计算不同的人数;如果不同的人数小于相同的,则计算相同的人数;如果二者相等,求不同的人数减一,因为不同的人数当中包含了相同的,求每一个循环的最大值。
#include <bits/stdc++.h>
using namespace std;
int a[200005];
int main()
{
ios::sync_with_stdio(false);
int t,n;
cin>>t;
while(t--)
{
cin>>n;
map<int,int> h;
set<int>s;
for(int i=1;i<=n;i++)
{
cin>>a[i];
h[a[i]]++;
s.insert(a[i]);
}
int cnt=s.size();
int m=0;
for(int i=1;i<=n;i++)
{
if(cnt>h[a[i]])
m=max(m,h[a[i]]);
else if(cnt==h[a[i]])
m=max(m,h[a[i]]-1);
else
m=max(m,cnt);
}
cout<<m<<endl;
}
return 0;
}
D. Anti-Sudoku
改一个9*9的数独,要求每一个3*3的块都包含至少两个相同的数字,,
由数独的规律可知,,每一个3*3的块数字都是1-9,所以随便找两个数,将一个改成另一个即可,,,
真是div3啊,,等着补补后面几道题。。
#include <bits/stdc++.h>
using namespace std;
char a[10][10];
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
cin>>a[i][j];
if(a[i][j]=='2')
a[i][j]='3';
}
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
cout<<a[i][j];
}
cout<<endl;
}
}
return 0;
}
→Judgement Protocol