文章目录
传送门
A - Balloons CodeForces - 998A
题意:a和b在玩游戏,他们买了n个泡泡盒子,每个泡泡盒子有a[i]个泡泡。
问有没有一种情况:a、b至少都有一个盒子,但泡泡的数量不一样。
注:本题的输出是b可以有几个泡泡盒子,以及这些盒子的i是什么。
**思路:**既然不用管顺序,那么直接排一下序,把最小的给a,其他的全给b
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+10;
int n,sum;
struct node{
int x,id;
}s[maxn];
bool ok;
int num;
bool cmp(const node&a,const node&b){
return a.x<b.x;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&s[i].x);
s[i].id=i;
}
sort(s+1,s+1+n,cmp);
for(int i=2;i<=n;i++){
sum+=s[i].x;
num++;
}
if(s[1].x==sum){
ok=true;
}
if(n==1){
ok=true;
}
if(!ok){
cout<<num<<endl;
for(int i=2;i<=n;i++){
if(i!=n)
printf("%d ",s[i].id);
else printf("%d\n",s[i].id);
}
}
else{
cout<<"-1"<<endl;
}
return 0;
}
B - Cutting CodeForces - 998B
题意:有一个整数序列,其中包含相等数量的偶数和奇数。在预算有限的情况下,您需要尽可能多地进行削减,以便每个结果段具有相同数量的奇数和偶数整数。
思路:只要奇数和偶数相同,就记录下来。
把所有可能进行排序,利用贪心,找出最大值
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+10;
int n,b;
int s[maxn];
int s1[maxn];
int p,q;
int k,sum,cnt;
int main(){
scanf("%d%d",&n,&b);
for(int i=1;i<=n;i++)
scanf("%d",&s[i]);
for(int i=1;i<n;i++){
if(s[i]%2==0)
p++;
else q++;
if(p==q&&p!=0&&q!=0){
s1[++k]=abs(s[i+1]-s[i]);
cnt+=abs(s[i+1]-s[i]);
}
}
sort(s1+1,s1+1+k);
// for(int i=1;i<=k;i++)
// cout<<s1[i]<<" ";
if(k==0){
cout<<0<<endl;
return 0;
}
if(cnt<=b){
cout<<k<<endl;
return 0;
}
int j=0;
while(b){
if(b>=s1[++j]){
b-=s1[j];
sum++;
}
else b=0;
}
printf("%d\n",sum);
return 0;
}
C - Convert to Ones CodeForces - 998C
题意:给你一个只有01的字符串,让你把它花费尽可能少,让它变成为1的字符串。
第一种转化:让其子串(包括本身)顺序颠倒过来比如110变成011,一次转化花费x
第二种转化:让其子串(包括本身)0变成1,1变成0,一次转化花费y
思路:
第一种转化和第二种转化都是将0或者1移动
比如:1001 都可以化成1100
s[0]要单独算,把1都移到一边,到最后再用第二种转化
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll x,y;
ll sum;
int cnt;
string s;
int main(){
scanf("%d%lld%lld",&n,&x,&y);
cin>>s;
if(s[0]=='0')cnt++;
for(int i=1;i<s.length();i++)
if(s[i]=='0'&&s[i-1]=='1')cnt++;
if(cnt==0)
{
cout<<0<<endl;
return 0;
}
sum=min((cnt-1)*x,(cnt-1)*y);
sum+=y;
printf("%lld\n",sum);
return 0;
}