题目链接:Codeforces Round #493 (Div. 2)
A:很明显的把最小值分给第二个人即可,然后判断是否合法。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int n,a[20],flag,m=1e9,s;
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],s+=a[i],m=min(m,a[i]);
s-=m;
if(s<=m) return puts("-1"),0;
cout<<n-1<<endl;
for(int i=1;i<=n;i++){
if(a[i]==m) flag++;
if(1==flag&&a[i]==m) continue;
cout<<i<<' ';
}
return 0;
}
B:我们可以找到奇偶分界线的交点,也就是可以切的地方,然后从小到大贪心切即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=110;
int n,a[N],b,n1,n2,res; priority_queue<int> q;
signed main(){
cin>>n>>b;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
if(a[i]&1) n1++;
else n2++;
if(n1==n2&&n1+n2!=n) q.push(-abs(a[i+1]-a[i]));
}
while(q.size()){
int u=-q.top(); q.pop();
if(u<=b) b-=u,res++;
else break;
}
cout<<res;
return 0;
}
C:我们可以发现一共就两种可能,要么把全部翻到一个地方,然后反转,要么直接对每一段0反转。我们取min即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
int n,x,y,cnt,k,res; char str[N];
signed main(){
cin>>n>>x>>y>>str+1; str[n+1]='1';
for(int i=1;i<=n;i++){
if(str[i]=='0'&&str[i+1]=='1') cnt++;
}
if(!cnt) puts("0");
else cout<<min(x,y)*(cnt-1)+y;
return 0;
}
D:暴力打表找规律。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int n,a[]={0,4,10,20,35,56,83,116,155,198,244,292,341,390,439};
signed main(){
cin>>n;
if(n<=11) cout<<a[n];
else cout<<292LL+49LL*(n-11);
return 0;
}