【loli的胡策】联校11.1(乱搞)

T1:

这里写图片描述

题解:

考试的时候60pts背包+方案输出。。。(期望得分50?
打稳了还是挺好
100pts:
求出前缀和,先模n出来,扫一遍看看有没有前缀和是0哒,如果有前缀和为0,那就直接输出1~x(前缀和是0的情况)
如果没有前缀和是0,有N个前缀和,取值范围是1~N-1,也就是说至少有两个前缀和是一样的
这有什么重要意义呢?假如说 sum[a]=sum[b](a<=b) 那么 sum[b]sum[a]=0
这是什么意思啊!这不就是指a+1~b凑出来个n嘛~,直接输出就好咯
这个尿性。。很像CF的C题啊

代码:

60pts

#include <cstdio>
#define N 1000005
using namespace std;
struct hh{int x,id;}a[N];
bool f[N];int tot,ans[N];
inline int in()
{
    char ch=getchar();int x=0,f=1;
    while (ch>'9'|| ch<'0') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
void find(int z,int up)
{
    if (z==0) return;
    for (int i=up;i>=1;i--)
      if (f[z-a[i].x])
      {
        ans[++tot]=a[i].id;
        find(z-a[i].x,i-1);
        break;
      }
}
int main()
{
    freopen("set.in","r",stdin);
    freopen("set.out","w",stdout);
    int n,i,j;
    n=in();
    for (i=1;i<=n;i++) {a[i].x=in(); a[i].id=i;}
    for (i=1;i<=n;i++)
    {
        a[i].x%=n;
        if (a[i].x==0) {printf("1\n%d",a[i].id);return 0;}
     } 
    bool vv=0;f[0]=1;
    for (i=1;i<=n;i++)
    {
        for (j=n;j>=a[i].x;j--)
        {
            f[j]=f[j] || f[j-a[i].x];
            if (f[n]){vv=1;break;} 
        }
        if (vv) break;
    }
    if (!vv){printf("-1");return 0;}
    else 
    {
        find(n,i);
        printf("%d\n",tot);
        for (i=1;i<tot;i++) printf("%d ",ans[i]);
        printf("%d",ans[tot]);
    }    
}

100pts

#include <cstdio>
#include <algorithm>
#define N 1000005
using namespace std;
int sum[N],a[N],c[N];
inline int in()
{
    char ch=getchar();int x=0,f=1;
    while (ch>'9'|| ch<'0') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main()
{
    freopen("set.in","r",stdin);
    freopen("set.out","w",stdout);
    int n,i,j;
    n=in();
    for (i=1;i<=n;i++) 
    {
        a[i]=in();
        a[i]%=n;sum[i]=(a[i]+sum[i-1])%n;
    }
    for (i=1;i<=n;i++)
      if (!sum[i]) 
      {
        printf("%d\n",i);
        for (j=1;j<=i;j++)
          printf("%d ",j);
        return 0;
      } 
    for (i=1;i<=n;i++)
    {
        if (c[sum[i]])
        {
            printf("%d\n",i-c[sum[i]]);
            for (j=c[sum[i]]+1;j<=i;j++)
              printf("%d ",j);
            return 0;
        }
        c[sum[i]]=i;
    }
    printf("%d",-1);
}

T2:

这里写图片描述
这里写图片描述

题解:

这个题是原题。。。
就是求n个数中的众数,如果没有众数就是0啦
有众数就是众数*2-总个数-1
因为就是把众数插在其他的数字中间,可以配对的数是2*num(众数的个数)-n(总个数)-1就是啦,这个-1?就是在第一位上再放一个众数啊

代码:

#include <cstdio>
#include <algorithm>
#define N 10005
using namespace std;
int cont[N],x[N],y[N],z[N],stack[N],cnt;
inline int in()
{
    char ch=getchar();int x=0,f=1;
    while (ch>'9'|| ch<'0') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main()
{
    freopen("read.in","r",stdin);
    freopen("read.out","w",stdout);
    int n=0,i,j,m,k;
    m=in();k=in();
    for (i=1;i<=m;i++) cont[i]=in();
    for (i=1;i<=m;i++) x[i]=in();
    for (i=1;i<=m;i++) y[i]=in();
    for (i=1;i<=m;i++) z[i]=in();
    int s=(1<<k)-1;int a=-1,now=0;
    for (i=1;i<=m;i++)
    {
        if (!now) a=x[i];
        if (x[i]!=a) now--;else now++;
        long long last=x[i];
        for (int j=1;j<cont[i];j++)
        {
            last=(last*y[i]+z[i])&s;
            if (!now) a=last;
            if (last!=a) now--;else now++;
        }
    }
    now=0;
    for (i=1;i<=m;i++)
    {
        ++n;
        if (x[i]==a) now++;
        long long last=x[i];
        for (int j=1;j<cont[i];j++)
        {
            last=(last*y[i]+z[i])&s;
            ++n;
            if (last==a) now++;
        }
    }
    now=now*2-n;
    if (now<0) printf("0");else printf("%d",now-1);
}

吐槽:

刚考完,loser:哎呀T2原题
喵喵喵:哪道题啊
loser:bzoj2456
喵喵喵(兴奋地进入bzoj):2~4~5~6
喵喵喵:。。。。。。
喵喵喵:这道题。。。我做过啊。。。。
然后仔细一看。woc竟然真的是原题。。只不过变了形形形形而已。。
。。。。。再见.jpg

T1的spj写挂了??
然后T1四种做法:
输出-1;期望得分10;实际得分0
n^2dp;期望得分50;实际得分60
科学的题解;期望得分100;实际得分100
什么都不输出;期望得分0;实际得分100
hahaha

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值