因为一些坑爹的人和规定,区域赛大概是不给打了,我也老了跟学弟折腾不动了,以后cf就当深夜娱乐吧TAT
A 瞎搞,注意不要sort
#include<bits/stdc++.h>
using namespace std;
int a[1001];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
if(n==1)
{
printf("-1");
return 0;
}
if(n==2&&a[0]==a[1])
{
printf("-1");
return 0;
}
// sort(a,a+n);
int s=0;
for(int i=0;i<n-1;i++)
{
s+=a[i];
}
int k=n-1;
//printf("s %d an %d\n",s,a[n]);
if(s==a[n-1])
{
//printf("!!!\n");
k--;
}
printf("%d\n",k);
for(int i=0;i<k;i++)
{
printf("%d ",i+1);
}
}
B 瞎搞,vector+sort也可以
#include<bits/stdc++.h>
using namespace std;
int a[101];
int n,b,ans;
priority_queue<int> q;
int main()
{
scanf("%d%d",&n,&b);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int j=0,o=0;
for(int i=0;i<n;i++)
{
if(a[i]%2==1)j++;
else o++;
// printf("j %d o %d\n",j,o);
if(j==o&&i!=n-1)
{
q.push(-fabs(a[i]-a[i+1]));
//printf("qq%d\n",a[i]-a[i+1]);
}
}
while(!q.empty())
{
int c=q.top();
q.pop();
if(b+c<0)break;
ans++;
b+=c;
if(q.empty())break;
}
printf("%d",ans);
}
C
1 相邻的0和1可以合并,最终只有0101这种形态
2 至少一次取反
3 每次翻转消去一个0,即少一次取反
4 考虑取反和翻转的成本两种情况
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int n,x,y;
scanf("%d%d%d",&n,&x,&y);
getchar();
char s[300005];
gets(s);
int n0=0,n1=0;
for(int i=0;i<n;i++)
{
if(s[i]=='0'&&i==0)n0++;
else if(s[i]=='0'&&s[i-1]!='0')n0++;
}
if(n0==0){
printf("0");
return 0;
}
if(x>=y)printf("%lld",(ll)n0*(ll)y);
else printf("%lld",(ll)y+(ll)(n0-1)*(ll)x);
}
D 深搜打表
这题感觉和哈希碰撞有点像,本来想找碰撞规律(大概是画一个表,然后找碰撞次数),不过暴力了一下发现规律…
打注释的是深搜代码
#include<bits/stdc++.h>
//#include <unistd.h>
#define ll long long
using namespace std;
int a[21][1001];
int b[]={1,5,10,50};
/*void dfs(int i,int x,int y)//i:used x:depth y:sum now
{
if(x==i)return;
for(int j=0;j<4;j++)
{
if(!a[i][y+b[j]]&&x==i-1){
// printf("y %d y+b[j] %d\n",y,y+b[j]);
a[i][y+b[j]]=1;
}
dfs(i,x+1,y+b[j]);
}
return;
}*/
int c[12]={0,4,10,20,35,56,83,116,155,198,244,292};
int main()
{
int n;
scanf("%d",&n);
if(n<=11){
printf("%d",c[n]);return 0;}
else printf("%lld",-247+(ll)49*(ll)n);
/* for(int i=1;i<=20;i++)
{
dfs(i,0,0);
int ans=0;
for(int j=0;j<1001;j++)
{
if(a[i][j])ans++;
}
printf("%d %d\n",i,ans);
}
sleep(50);*/
return 0;
}