1 条题解
-
2
//根据题意 //对于每一位棺材板 只需要查找标记为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
- 上传者