Codeforces Round 610

比赛的时候打了3题,由于手残加各种奇葩傻逼错误,最后竟被hack剩1题,立个flag标志一下!!!
题目传送门:
http://codeforces.com/problemset/problem/610/A
既然忘记判断筷子是奇数的情况了,一定要注意特判n小以及待处理表达式是否满足的情况,即遇到除以2的时候就一定要想到奇偶的问题

int main()
{
    s(n);
    if(n<6||n&1) 
    {
        puts("0");return 0;
    }
    n/=2;
    p((n-1)/2); 
    return 0;
}

传送门:
http://codeforces.com/problemset/problem/610/B

首先都减到0,然后再找间隔最长的两个,刚开始忘记开2倍 runtime error了,然后inf又开成999999999了,导致1e9的时候wrong了,都是sb错误,手太残了

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<math.h>
#include<stdlib.h>
#include<vector>
#include<map>
#include<string>
using namespace std;
#define ll long long
#define For(i,n) for(int i=1;i<=n;i++)
#define Dor(i,n) for(int i=n;i>=1;i--)
#define s(n) scanf("%d",&n)
#define p(n) printf("%d\n",n)
//#define maxn 200000+10
#define ms(n) memset(n,0,sizeof(n))
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const double eps=1e-8;
const int inf=0x3f3f3f3f;
const int maxn=2e5+10;
int n;
int a[2*maxn];
ll sum=0;
int main()
{
    s(n);
    //1000000000
    int minn=1000000000;int minpos;
    //int 
    for(int i=0;i<n;i++)
    {
        s(a[i]);
        if(a[i]<=minn)
        {
            minn=a[i];
            minpos=i;
        }
    }
    for(int i=n;i<2*n;i++)
    {
        a[i]=a[i-n];
    }
    int summ=0;int maxx=0;
    int flag=0;
    for(int i=0;i<2*n;i++)
    {
        if(a[i]==minn)
        {
            flag=1;
            if(summ>maxx)
            {
                maxx=summ;
            }
            summ=0;
        }
        else if(flag) summ++;
    }

    sum+=1ll*minn*n;
    sum+=maxx;
    printf("%I64d\n",sum);  
    return 0;
}

传送门:http://codeforces.com/contest/610/problem/C

构造n维向量使得两两相乘代数和为0
递推解决,根据n构造n+1时候的方案
so easy 的证明:
左上不变,右上为左上取反
因为这样可以保证左半为0,右半也为0
然后根据思维的对称性,左下和右下与上面的乘积为0的原因一定是一正一负造成的,因此左下与左上一样,右下为右上取反即可以了
就能保证左正右负
写的时候一定要注意循环的次数,且向这种n很小的题目,一定要注意把所有情况都试一遍
constructive method

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<math.h>
#include<stdlib.h>
#include<vector>
#include<map>
#include<string>
using namespace std;
#define ll long long
#define For(i,n) for(int i=1;i<=n;i++)
#define Dor(i,n) for(int i=n;i>=1;i--)
#define s(n) scanf("%d",&n)
#define p(n) printf("%d\n",n)
//#define maxn 200000+10
#define ms(n) memset(n,0,sizeof(n))
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const double eps=1e-8;
const int inf=0x3f3f3f3f;
const int maxn=1e5+10;
int n;
int a[2010][2010];
int main()
{
    s(n);   
    a[1][1]=1;a[1][2]=1;
    a[2][1]=1;a[2][2]=-1;
    for(int i=2;i<=(1<<n);i*=2)
    {
      for(int k=1;k<=i;k++)
      {
        for(int j=i+1;j<=2*i;j++)
        {
            a[k][j]=-a[k][2*i+1-j];
        }
      }
      for(int k=i+1;k<=2*i;k++)
      {
        for(int j=1;j<=i;j++)
        {
            a[k][j]=a[k-i][j];
        }
      }
      for(int k=i+1;k<=2*i;k++)
      {
        for(int j=i+1;j<=2*i;j++)
        {
            a[k][j]=a[k][2*i+1-j];
        }
      }
    }
    for(int i=1;i<=(1<<n);i++)
    {
        for(int j=1;j<=(1<<n);j++)
        {
            if(a[i][j]==1) printf("+");
            else printf("*");
        }
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值