1 条题解

  • 2
    @ 2023-10-14 20:58:48
    //根据题意
    //对于每一位棺材板 只需要查找标记为1的前一位是否为零并且大于该标记的对应的数 则进行交换
    //一种特殊情况为 该数标记为1但是前一位小于该数(令其为a),但是该数往后连续个1标记的数中有小于a的数(令为b) 
    //此时只需要将(a到b)所有棺材板左移一位便是最优解(其实就是a,b的标记交换,拿笔写一写就知道了);
    //代码如下:
    #include<stdio.h>
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	while(t--)
    	{
    		int n;
    		scanf("%d ",&n);
    		char s[n];
    		int a[n];
    		scanf("%s",s);
    		int sum=0;
    		for(int i=0;i<n;i++)
    		{
    			scanf("%d",&a[i]);
    		}
    		for(int i=1;i<n;i++)
    		{
    			if(a[i-1]>a[i]&&s[i-1]=='0'&&s[i]=='1')
    			{
    				s[i-1]='1';
    				s[i]='0';
    			}
    			else if(s[i-1]=='0'&&s[i]=='1')//第二种情况 
    			{
    				for(int j=i+1;j<n;j++)
    				{
    					if(s[j]!='1')
    					break;
    					else if(s[j]=='1'&&a[j]<a[i-1])//如果满足 
    					{
                                s[i-1]='1';//交换 
    							s[j]='0';
    							break;	//跳出循环
    					}
    				}
    			}
    		}
    		for(int i=0;i<n;i++)
    		{
    			if(s[i]=='1')
    			 sum=sum+a[i];
    		}
    		printf("%d\n",sum);
    	}
    } 
     
    
  • 1

信息

ID
895
时间
1000ms
内存
256MiB
难度
8
标签
递交数
292
已通过
46
上传者