文章目录
前言
vp补题
A. Finding Maximal Non-Trivial Monotones
题意:给定只含有a,b的字符串,找到连续的a的个数(只有一个a记为0)
coding
void solve()
{
int n;
cin>>n;
string s;
cin>>s;
int ans=0;
s+='b';
int cnt=0;
for(int i=0;i<=n;i++){
if(s[i]=='b'){
ans+=cnt;
cnt=0;
}
else{
if(cnt)cnt++;
else if(i-1>=0&&s[i-1]=='a')cnt+=2;
}
}
cout<<ans<<endl;
}
D. Displacing Particles
题意:给定n,x,y,矩形(0,0),(0,2N),(2N,2N),(2N,0),从(x,y)每次只能选择一个顶点与之相连并走到线段中点
问:需要走多少次能够走到矩形终点?
思路:直接dfs
coding
int a[N];
int l, r;
int n, x, y;
void dfs(int k, int res)
{
if(x == k)
{
printf("%d", res);
return;
}
if(k % 2 == 0) dfs(k / 2, res + 1);
if((k + r) % 2 == 0) dfs((k + r) / 2, res + 1);
}
void solve(){
scanf("%d %d %d", &n, &x, &y);
l = 0;
r = 1;
for(int i=1;i<=n;i++)r *= 2;
int k = r / 2;
dfs(k, 0);
}
E. Eliminating Ballons
题意:n个气球有一定的高度,每次射出的箭射到一个气球箭的高度就会–
问:射几支箭能够将所有的气球射完?
思路:气球高h被射中一定是因为h+1被射后才会被射中,那么直接记录前一个被射气球有没有,没有就将res++,否则目前高度气球–
void solve(){
int n;
scanf("%d", &n);
map<int, int> m;
int res = 0;
for(int i=1;i<=n;i++)
{
int k;
scanf("%d", &k);
if(m[k] == 0) res++;
else m[k]--;
m[k - 1]++;
}
printf("%d", res);
}
F. Multidimensional Hangman
题意:给字符串星号处填上字母,使得某个单词尽可能的多,输出最多的单词和数量。
coding
void solve(){
int n, c;
scanf("%d %d", &n, &c);
string s;
map<string, int> m;
for(int i = 1; i <= n; i++)
{
cin >> s;
int p = 0;
for(int j = 0; j < n; j++) if(s[j] == '*')
{
p = j;
break;
}
for(int j = 0; j < 26; j++)
{
char k = 'a' + j;
string t = s;
t[p] = k;
m[t]++;
}
}
int res = 0;
string sr;
for(auto [x, y] : m)
{
if(y > res) sr = x, res = y;
else if(y == res && sr > x)
{
sr = x;
}
}
cout << sr << " " << res;
}
I. Intercepting Information
题意:给定数字中出现9就输出F
void solve()
{
int flag=1;
for(int i=1;i<=8;i++){
int x;
cin>>x;
if(x==9)
flag=0;
}
if(flag)cout<<"S"<<endl;
else cout<<"F"<<endl;
}
J. Playing 23
题意:Jack和Marry玩23点的游戏,Jack和Marry开始都有两张手牌,后来两人也会的到n张相同的手牌
问:最后使得Marry能够赢下一张手牌拿到的数字最小是几?
注意事项:
1.每个数字的牌最多4张,拿完了就没有了
2.值为10的手牌不止4张(还有J、Q、K都代表10)
3.要尽可能的使需要的手牌值最小
4.两人手牌值一直相等是双赢的局面,也可认为Marry赢了
思路:能够让Marry赢有两种可能,Jack手牌值>23或者Marry手牌值=23
coding
map<int,int>mp;
void solve(){
int n;
scanf("%d",&n);
int Jack=0,Marry=0;
int x,y;
scanf("%d %d",&x,&y);
mp[x]++,mp[y]++;
if(x==11||x==12||x==13)
x=10;
if(y==11||y==12||y==13)
y=10;
Jack+=x+y;
scanf("%d %d",&x,&y);
mp[x]++,mp[y]++;
if(x==11||x==12||x==13)
x=10;
if(y==11||y==12||y==13)
y=10;
Marry+=x+y;
for(int i=1;i<=n;i++){
scanf("%d",&x);
mp[x]++;
if(x==11||x==12||x==13)
x=10;
Jack+=x;
Marry+=x;
}
int sum1=23-Jack+1;
int sum2=23-Marry;
if(sum1>10&&sum2>10){
printf("-1\n");
return;
}
else if(Jack==Marry){
printf("%d\n",sum2);
return;
}
else if(Jack>Marry){
for(int i=sum1;i<=sum2;i++){
if(mp[i]<4){
printf("%d\n",i);
return;
}
}
printf("-1\n");
return;
}
else if(Jack<Marry){
if(mp[sum2]==4)printf("-1\n");
else printf("%d\n",sum2);
}
}
总结
H:强连通分量待补
N:树状数组维护前K大前缀和待补