2022-2023 ICPC Brazil Subregional Programming Contest


前言

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大前缀和待补

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值