codeforces #493 A~D(7.1)

因为一些坑爹的人和规定,区域赛大概是不给打了,我也老了跟学弟折腾不动了,以后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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_viceversa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值