2559. [NOIP二〇一五]组合数难题,2559noip2015

标题陈述

在一个n*m的只包涵0和1的矩阵里找寻一个不包蕴0的最大长方形,输出边长。

【样例2输出】

0
7

输入输出格式

输入格式:

率先行五个整数M和N。第2行到第M+1行,每行N个整数描述海拔高度。第2+M行到第1+2M

行,每行N个整数,种种数非0即1,1象征该单元格是贰个路标。

出口格式:

贰个寸头,即赛道的难度周详D。

简单题

输入输出格式

输入格式:

输入文件首先行事多少个整数n,m(1<=n,m<=100),接下去n行,每行m个数字,用空格隔绝,0或1.

输出格式:

四个整数,最大正方形的边长

【输入格式】

   从文件中读入数据。

   第一行有八个整数t,
k,在那之中t代表该测量检验点总共有稍许组测量试验数据,k的含义见【难题陈述】。

   接下来t行每行八个整数n, m,当中n, m的意思见【难题汇报】。

P2658 小车拉力比赛,p2658小车拉力

Font Size: ← →

吉利今儿早上吃鸡

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K
(Java/Other)

Total Submission(s) : 1379   Accepted Submission(s) : 501

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

近年风行吃鸡,那就直接出口一行”Winner winner ,chicken
dinner!”(未有双引号)
模板代码:
#include <stdio.h>
int main(){
printf(“hello world\n”);
return 0;
}

Input

从未有过输入

Output

出口一行”Winner winner ,chicken dinner!”注意要换行

Sample Output

Winner winner ,chicken dinner!

解题报告:

签到题

#include <stdio.h>
int main(){
printf(“Winner winner ,chicken dinner!\n”);
return 0;
}

 

1002      

跳舞

Time Limit : 3000/1500ms (Java/Other)   Memory Limit : 65535/32768K
(Java/Other)

Total Submission(s) : 354   Accepted Submission(s) : 38

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

一天YZW加入了全校协会交际舞活动,活动的起初活动方分别给男士和女孩子从1-n拓宽编号,依照从小到辽朝时针的措施开展男女搭档分配,一样编号的儿女组合成一对,举例一号汉子与一号女子配成对,依此类推。不过YZW对内部叁个小表姐一往情深,于是趁机的她向管理员提议了二种操作
1.在这种景况下,管理员会给出移动的势头和大小,然后全数的男士向着那么些方向移动x个地点。2.管理员会把相邻的奇数和偶数地点上的汉子调换。
在个中女子的职分是不会变的。可是YZW不领悟通过那一个Q次操作后,他和煦身在哪里,能还是不能到达本人喜欢的小大姨子身边。

Input

输入三个T代表T组数据(T<=10),每组输入三个n和q(2≤n≤三千00,1≤q≤一千000,个中n为偶数),分别表示有n对儿女和有q次操作。
接下去是q行,每一行输入:
1.x意味着享有汉子移动的职分的轻重。同期x>0意味顺时针移动,x<0意味逆时针移动。
2.代表管理员会把左近的奇数和偶数地点上的男士交换。

Output

出口1号到n号小表嫂配对的各自是几号汉子。

Sample Input

1

6 3

1 2

2

1 2

Sample Output

4 3 6 5 2 1

 

解题报告:记录第二个和第贰个男士的地方n1和n2,将具有的操作的震慑加在这些两任务上,当中第一种操作也正是n1和n2加上或然减去x,第三种操作也正是奇数地点上的数+1,偶数位上的数-1.然后透过如此七个岗位推导出富有的其他的任务就能够

代码:

#include<iostream>

#include<cstdio>

#include<cmath>

#include<string>

#include<queue>

#include<algorithm>

#include<stack>

#include<cstring>

#include<vector>

#include<list>

#include<bitset>

#include<set>

#include<map>

using namespace std;

#define LL long long

#define pi (4*atan(1.0))

#define eps 1e-8

#define bug(x)  cout<<“bug”<<x<<endl;

const int N=1e6+10,M=7e6+10,inf=1e9+10,MOD=10;

const LL INF=1e18+10;

 

int a[N];

int main()

{

    int T;

    scanf(“%d”,&T);

    while(T–)

    {

        int n,q;

        scanf(“%d%d”,&n,&q);

        int s=1,e=2;

        while(q–)

        {

            int t;

            scanf(“%d”,&t);

            if(t==1)

            {

                LL x;

                scanf(“%lld”,&x);

                x%=n;

                s+=x;

                e+=x;

                if(s>n)s-=n;

                if(s<=0)s+=n;

                if(e>n)e-=n;

                if(e<=0)e+=n;

            }

            else

            {

                if(s%2)s++;

                else s–;

                if(e%2)e++;

                else e–;

            }

        }

        for(int i=1;i<=n/2;i++)

        {

            a[s]=i*2-1;

            a[e]=i*2;

            s+=2;

            e+=2;

            if(s>n)s-=n;

            if(e>n)e-=n;

        }

        for(int i=1;i<=n;i++)

            printf(“%d%c”,a[i],(i==n?’\n’:’ ‘));

    }

    return 0;

}

1003

那是道水题

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K
(Java/Other)

Total Submission(s) : 827   Accepted Submission(s) : 179

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

有三个球在长度为L的直线跑道上移步,两端为墙。0时刻小球a以1m/s的快慢从起源向终极运动,t时刻小球b以平等的进度从巅峰向源点运动。问T时刻一个球的离开。这里小球与小球、小球与墙的冲击均为弹性碰撞,全体进度未有能量损失。

Input

先输入二个q,代表q组数据,然后每组3个整数 L,t,T。
1<=L<=1000;0<=t<=1000;t<=T<=1000;

Output

多个大背头,代表答案。

Sample Input

2

10 4 7

8 3 9

Sample Output

0

5

解题报告:单独思索每种小球,分别求出最终小球的职位pos1,pos2。答案即为abs(pos1-pos2)。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

int main()
{
    int L,t,T;
    int cas;
    scanf(“%d”,&cas);
    while(cas–&&scanf(“%d %d %d”,&L,&t,&T)){
        int n=T%(2*L);
        int l;
        if(n>=L){
            l=L-(n-L);
        }else{
            l=n;
        }
        int r;
        int n2=(T-t)%(2*L);
        if(n2>=L){
            r=L-(n2-L);
        }else{
            r=n2;
        }
        r=L-r;
        int ans=r-l;
        if(ans>=0){
            printf(“%d\n”,ans);
        }else{
            printf(“%d\n”,-1*ans);
        }
    }
    return 0;
}

 

1004

 

小廖的漂亮子串

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K
(Java/Other)

Total Submission(s) : 7   Accepted Submission(s) : 0

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

小廖这段时间沉迷于字符串,开掘了二个难题,不可能化解,非常沮丧。你能辅助他吗?
对于贰个尺寸为n的字符串,能够从大小为m的字母表里选取构成。
概念一个字符串是雅观的就满足:要是它的拥有字符适当改变各类后能够整合三个回文串况且长度为奇数。
那正是说难点来了,大小为m的字母表组成的具备大小为n的串有m^n个,其含有美貌的子串的总额是稍稍?

Input

第一输入一个t,代表t组数据t<=100
每组数据输入n,m,n代表字符串的尺寸,m代表字母表的轻重缓急。
1<=n,m<=2000

Output

输出结果mod一千000007。(mod表示取余)

Sample Input

3

2 2

3 2

10 3

Sample Output

8

32

1490526


解题报告:

设dp[i][j]意味着长度为i的串有j种字符现身单多次的个数。

dp[i][j]只能由dp[i-1][j-1]和dp[i-1][j+1]转化来。

假如长度为i-1的串有j-1种字符出现单数拾一次,能够在余下的(m-j+1)种字符选择二个;

如若长度为i-1的串有j+1种字符出现单数十二次,能够在(j+1)种字符里任选八个;

故此状态转移方程为:
dp[i][j]=(dp[i-1][j-1]*(m-j+1)+dp[i-1][j+1]*(j+1))

小心若能结合回文串,当长度为奇数时j=1,不然j=0.

枚举奇数长度i的串,其岗位能够有(n-i+1)种,其余n-i位任性补齐,所以对于长度为i有

dp[i][1]*p[n-i]*(n-i+1)个,p[n-i]代表m的n-i次方。累加求和收获

ans=(ans+dp[i][i&1]*po[n-i]%mod*(n-i+1)%mod)%mod;

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<bitset>
#include<set>
#include<map>
#include<time.h>
#define F(x) (3*x*x-x)/2
using namespace std;
typedef long long ll;
const int maxn=2000+10;
const int mod=1e9+7;
int n,m;
ll dp[maxn][maxn],po[maxn];
int main()
{
    int t;
    scanf(“%d”,&t);
    while(t–)
    {
        scanf(“%d%d”,&n,&m);
        dp[0][0]=1;dp[0][1]=0;
        for(int i=1;i<=n;i++)
        {
            dp[i][0]=dp[i-1][1];
            dp[i][i]=(dp[i-1][i-1]*(m-i+1))%mod;
            int j;
            if(i&1)j=1;
            else j=2;
            for(;j<i;j+=2)
            {
                dp[i][j]=(dp[i-1][j-1]*(m-j+1)+dp[i-1][j+1]*(j+1))%mod;
            }
        }
        po[0]=1;
        for(int i=1;i<=n;i++)
        po[i]=(po[i-1]*m)%mod;
        ll ans=0;
        for(int i=1;i<=n;i++)
        {
                    if(i%2)
            ans=(ans+dp[i][i&1]*po[n-i]%mod*(n-i+1)%mod)%mod;
        }
        printf(“%lld\n”,ans);
    }
    return 0;
}

 

1005      

矩阵

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K
(Java/Other)

Total Submission(s) : 168   Accepted Submission(s) : 52

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

借使你有二个矩阵,有如此的运算A^(n+1) = A^(n)*A (*代表矩阵乘法)
今天已知三个n*n矩阵A,S =
A+A^2+A^3+…+A^k,输出S,因为每贰个因素太大了,输出的各个成分模10

Input

先输入一个T(T<=10),每组二个n,k(1<=n<=30, k<=一千000)

Output

输出叁个矩阵,每一种成分模10(行末尾未有剩余空格)

Sample Input

1

3 2

0 2 0

0 0 2

0 0 0

Sample Output

0 2 4

0 0 2

0 0 0

解题报告:

倍增,复杂度log(k)*n*n

代码:

#include<iostream>

#include<cstdio>

#include<cmath>

#include<string>

#include<queue>

#include<algorithm>

#include<stack>

#include<cstring>

#include<vector>

#include<list>

#include<bitset>

#include<set>

#include<map>

using namespace std;

#define LL long long

#define pi (4*atan(1.0))

#define eps 1e-8

#define bug(x)  cout<<“bug”<<x<<endl;

const int N=1e6+10,M=7e6+10,inf=1e9+10,MOD=10;

const LL INF=1e18+10;

int n;

struct Matrix

{

    short a[31][31];

    Matrix()

    {

        memset(a,0,sizeof(a));

    }

    void init()

    {

        for(int i=0;i<n;i++)

            for(int j=0;j<n;j++)

                a[i][j]=(i==j);

    }

    Matrix operator + (const Matrix &B)const

    {

        Matrix C;

        for(int i=0;i<n;i++)

            for(int j=0;j<n;j++)

                C.a[i][j]=(a[i][j]+B.a[i][j])%MOD;

        return C;

    }

    Matrix operator * (const Matrix &B)const

    {

        Matrix C;

        for(int i=0;i<n;i++)

            for(int k=0;k<n;k++)

                for(int j=0;j<n;j++)

                   
C.a[i][j]=(C.a[i][j]+a[i][k]*B.a[k][j])%MOD;

        return C;

    }

    Matrix operator ^ (const int &t)const

    {

        Matrix A=(*this),res;

        res.init();

        int p=t;

        while(p)

        {

            if(p&1)res=res*A;

            A=A*A;

            p>>=1;

        }

        return res;

    }

}a[100],base;

 

int main()

{

    int T;

    scanf(“%d”,&T);

    while(T–)

    {

        int k;

        scanf(“%d%d”,&n,&k);

        for(int i=0;i<n;i++)

        for(int j=0;j<n;j++)

        scanf(“%d”,&a[1].a[i][j]);

        base=a[1];

        for(int i=2;i<=20;i++)

        {

            a[i]=a[i-1]+(a[i-1])*base;

            base=base*base;

        }

        base=a[1];

        Matrix now,ans;

        now.init();

        for(int i=19;i>=0;i–)

        {

            if((1<<i)&k)

            {

                ans=ans+a[i+1]*now;

                now=now*(base^(1<<i));

            }

        }

        for(int i=0;i<n;i++)

        {

            for(int j=0;j<n;j++)

                printf(“%d%c”,ans.a[i][j],(j==n-1?’\n’:’ ‘));

        }

    }

    return 0;

}

1006      

大厦

Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65535/32768K
(Java/Other)

Total Submission(s) : 41   Accepted Submission(s) : 2

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

给你二个n(1<=n<=一千)层楼的摩天天津大学学厦,每一楼中间有m(1<=m<=一千)房间,
种种房间一定的金钱X(1<=x<=1000),假若差异楼层的房子是互通的,同样楼层的房间是不互通的。也正是说每层只可以取一个,将来给您四个捡钱的机会。捡钱的措施区别,会导致您得到的钱的两样,求只怕捡到的钱的前k大的和

Input

输入二个T,表示T组样例;
每组数据第一行输入n,m,k
接下去输入n行,每行m个数,代表那几个房子装有的资财

Output

出口可能捡到的钱的前k大的和

Sample Input

1

3 4 5

1 2 3 4

5 6 7 8

1 2 3 4

Sample Output

75

解题报告:

假设任性两层为集结A
B(从大到小排序)对于B会集的成分B[i],显著它和A[1]组合值最大,

如果B[i]+A[j]是前K大值中的三个,那么B[i]+A[k](1<=k <
j)必然也是前K大的,

所以B[i]+A[j]被选则B[i]+A[j-1]事先就被选了,

据此优先队列中只需保证Size(B)个成分,首先把A[1]+B[i]全副进队,

每一趟从队首拿出一个结合(i,j)(表示A[i]+B[j]),把A[i+1]+B[j]进队,

以致拿出K个元素截止,即为那七个聚众合併的前K大

n层的话只要把每回获得的结果和别的层依据这样管理就能够了

代码:

#include<iostream>

#include<cstdio>

#include<cmath>

#include<string>

#include<queue>

#include<algorithm>

#include<stack>

#include<cstring>

#include<vector>

#include<list>

#include<bitset>

#include<set>

#include<map>

using namespace std;

#define LL long long

#define pi (4*atan(1.0))

#define eps 1e-8

#define bug(x)  cout<<“bug”<<x<<endl;

const int N=1e3+10,M=7e6+10,inf=1e9+10,MOD=10;

const LL INF=1e18+10;

 

 

int a[N],k,n,m;

vector<int>v;

struct is

{

    int x,pos;

    is(){}

    is(int _x,int _pos):x(_x),pos(_pos){}

    bool operator <(const is &c)const

    {

        return x<c.x;

    }

};

int cmp(int x,int y)

{

    return x>y;

}

vector<int> update(vector<int>v)

{

    vector<int>ans;

    if(v.size()*m<=k)

    {

        for(int i=0;i<v.size();i++)

        for(int j=1;j<=m;j++)

            ans.push_back(v[i]+a[j]);

        sort(ans.begin(),ans.end(),cmp);

    }

    else

    {

        priority_queue<is>q;

        for(int i=1;i<=m;i++)

        {

            q.push(is(a[i]+v[0],0));

        }

        int tmp=k;

        while(tmp–)

        {

            is x=q.top();

            ans.push_back(x.x);

            q.pop();

            if(x.pos+1<v.size())

            q.push(is(x.x-v[x.pos]+v[x.pos+1],x.pos+1));

        }

    }

    return ans;

}

int main()

{

    int T;

    scanf(“%d”,&T);

    while(T–)

    {

        scanf(“%d%d%d”,&n,&m,&k);

        v.clear();

        v.push_back(0);

        for(int i=1;i<=n;i++)

        {

            for(int j=1;j<=m;j++)

                scanf(“%d”,&a[j]);

            v=update(v);

        }

        LL ans=0;

        for(int i=0;i<k;i++)

            ans+=v[i];

        printf(“%lld\n”,ans);

    }

    return 0;

}

1007      

至上牛奶

Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 65535/32768K
(Java/Other)

Total Submission(s) : 52   Accepted Submission(s) : 6

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

商铺有 n 种牛奶,每一个牛奶的浓淡为 ai/一千 。
Iris 想合成出一种浓度为 k/1000的特级牛奶,每一种牛奶能够买放肆杯,她起码必要买多少杯牛奶呢?

Input

多组输入,每组数据第一行输入 k、n ,第二行输入 n 个数ai,表示 n
种牛奶的浓度。
0<=k<=一千 , 1<=n<=一千000, 0<=ai<=1000 。
所给多少都以整数。

Output

每组数据输出二个数,表示最少要买多少杯牛奶。 假如无法合成浓度为 k/1000的牛奶,就输出 -1 。

Sample Input

50 2

100 25

Sample Output

3

解题报告:要专一到浓度绝不会超越一千/一千。

设若选用m杯牛奶,则 (a1+a2+……+am) / m =
n,调换一下为(a1-n)+(a2-n)+……+(am-n) = 0。即要选 m杯牛奶,其浓度减
n之和为0。而浓度不超过一千,故(a1-n)+(a2-n)+….+(as-n)的和必然在
-一千~一千时期,所以能够 bfs解,也就是找一条浓度0 到浓度0
的门径,边长为(ai-n),那样到各样恐怕浓度点的偏离一定是近些日子的。

代码:

#include<iostream>

#include<cstdio>

#include<cmath>

#include<string>

#include<queue>

#include<algorithm>

#include<stack>

#include<cstring>

#include<vector>

#include<list>

#include<bitset>

#include<set>

#include<map>

using namespace std;

#define LL long long

#define pi (4*atan(1.0))

#define eps 1e-8

#define bug(x)  cout<<“bug”<<x<<endl;

const int N=1e3+10,M=7e6+10,inf=1e9+10,MOD=10;

const LL INF=1e18+10;

 

vector<int>v[5];

int flag[N][2];

int dp[N][2];

int main()

{

    int k,n;

    while(~scanf(“%d%d”,&k,&n))

    {

        v[0].clear();

        v[1].clear();

        memset(flag,0,sizeof(flag));

        memset(dp,-1,sizeof(dp));

        int fuck=0;

        for(int i=1;i<=n;i++)

        {

            int x;

            scanf(“%d”,&x);

            if(x==k)fuck=1;

           
if(x<k&&!flag[k-x][0])v[0].push_back(k-x),flag[k-x][0]=1;

           
if(x>k&&!flag[x-k][1])v[1].push_back(x-k),flag[x-k][1]=1;

        }

        if(fuck)

        {

            printf(“1\n”);

            continue;

        }

        dp[0][0]=0;

        dp[0][1]=0;

        for(int kk=0;kk<=1;kk++)

        for(int i=0;i<v[kk].size();i++)

        {

            for(int j=v[kk][i];j<=1000;j++)

            {

                if(dp[j-v[kk][i]][kk]!=-1)

                {

                   
if(dp[j][kk]==-1)dp[j][kk]=dp[j-v[kk][i]][kk]+1;

                    else
dp[j][kk]=min(dp[j][kk],dp[j-v[kk][i]][kk]+1);

                }

            }

        }

        int ans=inf;

        for(int i=1;i<=1000;i++)

        if(dp[i][0]!=-1&&dp[i][1]!=-1)

        {

            ans=min(ans,dp[i][0]+dp[i][1]);

        }

        if(ans==inf)printf(“-1\n”);

        else printf(“%d\n”,ans);

    }

    return 0;

}

 

1008      

子序列

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K
(Java/Other)

Total Submission(s) : 499   Accepted Submission(s) : 270

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

长度为 n
的队列,把它划分成两段非空的子种类,定义权值为:两段子体系的最大值的差的绝对值。求恐怕的最大的权值。
数量范围:
2 <= n <= 10^6 , 0 < 体系内的数 <= 10^6 。

Input

第一行输入三个 T,表示有 T 组数据。
接下去有 T 组数据,每组数据的率先行输入三个数 n ,第二行输入 n 个数。

Output

每组数据输出恐怕的最大的权值。

Sample Input

1

3

1 2 3

Sample Output

2

解题报告:

签到题,代码:

#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int a[1000010];
int main()
{
  int t;
  cin>>t;
  while(t–)
  {
   int maxn=0;int k,n;
   memset(a,0,sizeof(a));
   cin>>n;
   for(int i=1;i<=n;i++){
  
   cin>>a[i];
   if(a[i]>maxn)
   {
   maxn=a[i];
   k=i;
  }
  
  
                        }
    int k2;
    if(k!=1&&k!=n)
    k2=min(a[1],a[n]);
    else if(k==a[1])
    {
    
     k2=a[n];
    
}
else
k2=a[1];
cout<<maxn-k2<<endl;
  }
return 0;
}

 

1009

 

MDD的任意数

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K
(Java/Other)

Total Submission(s) : 61   Accepted Submission(s) : 28

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

MDD随机生成了n(n<le5)个随机数x(x<=1e9),
那n个随机数排成贰个系列,MDD有q(q<=le5)个询问,
各样询问给您一个a,问您这一个行列中有稍许个区间的最大公约数不为a

Input

先是行输入三个T,表示T组测量试验样例
每组样例包罗一个n,表示n个随机数
再输入三个Q,表示Q个询问
各样询问输入二个a

Output

种种询问输出有微微个区间的gcd不为a

Sample Input

1

5

1 2 4 4 1

4

1

2

3

4

Sample Output

6

12

15

12

题解:思虑到假若固定区间左端点L,那么右端点从L+1变化到n的经过中gcd最多变化logn次(因为每趟更动至少除以2),那么大家就足以枚举左端点,然后每一回二分值一连的间距,然后都存到map里,只需求将具备的距离个数减去区间gcd=x的个数正是主旨的答案

代码:#include<iostream>

#include<cstdio>

#include<cmath>

#include<string>

#include<queue>

#include<algorithm>

#include<stack>

#include<cstring>

#include<vector>

#include<list>

#include<bitset>

#include<set>

#include<map>

using namespace std;

#define LL long long

#define pi (4*atan(1.0))

#define eps 1e-8

#define bug(x)  cout<<“bug”<<x<<endl;

const int N=1e3+10,M=7e6+10,inf=1e9+10,MOD=10;

const LL INF=1e18+10;

 

int a[N];

map<int,LL>dp[N],ans;

map<int,LL>::iterator it;

int main()

{

    int n,T;

    scanf(“%d”,&T);

    while(T–)

    {

        scanf(“%d”,&n);

        ans.clear();

        for(int i=1;i<=n;i++)

            dp[i].clear();

        for(int i=1;i<=n;i++)

            scanf(“%d”,&a[i]);

        for(int i=1;i<=n;i++)

        {

            dp[i][a[i]]++;

            ans[a[i]]++;

            for(it=dp[i-1].begin();it!=dp[i-1].end();it++)

            {

                int x=it->first;

                LL z=it->second;

                int now=__gcd(x,a[i]);

                dp[i][now]+=z;

                ans[now]+=z;

            }

        }

        LL sum=1LL*n*(n+1)/2;

        int q;

        scanf(“%d”,&q);

        while(q–)

        {

            int x;

            scanf(“%d”,&x);

            printf(“%lld\n”,sum-ans[x]);

        }

    }

    return 0;

}

1010

QAQ

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K
(Java/Other)

Total Submission(s) : 1082   Accepted Submission(s) : 223

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

概念操作:将数 n 变为 f(n) =
floor(sqrt(n))。即对三个数开平方后,再向下取整。
如对 2 实行贰遍操作,开平方再向下取整, 1.414213562….. = 1 , 即变为了 1

今日交由二个数 n,假如能在 5 次操作内把 n 变为
1,则输出操作次数;假若则超越5次输出”QAQ”。
数码范围:
1<= n <= 10^100

Input

多组输入,每行输入二个数 n。

Output

每组数据输出要有些次操作,也许输出”QAQ”

Sample Input

233

233333333333333333333333333333333333333333333333333333333

Sample Output

3

QAQ

 

解题报告:签到题,大数

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include<string.h>
using namespace std;

int main()
{
char str[1000005];
 long long n;
 while(cin>>str)
 {  
    double ant=0;
    
  int len=strlen(str);
  if(len>10)
  cout<<“QAQ”<<endl;
  else
  {
  for(int i=0;i<len;i++)
  {
  ant=ant*10+str[i]-‘0’;
 }
 int flag=0;
 while(ant!=1)
 {
  ant= floor(sqrt(ant));
  flag++;
 }
 if(flag>5)
 cout<<“QAQ”<<endl;
 else
 cout<<flag<<endl;
 }
 }
 
    return 0;
}

P1387 最大长方形,P1387星型

【样例1输出】

1

输入输出样例

输入样例#1:

3 5 
20 21 18 99 5  
19 22 20 16 26
18 17 40 60 80
1 0 0 0 1
0 0 0 0 0
0 0 0 0 1

输出样例#1:

21

一开始写二分答案+BFS,T了7个点

图片 1 1
#include<iostream> 2 #include<cstdio> 3
#include<cstring> 4 #include<cmath> 5
#include<queue> 6 #include<cstdlib> 7 using namespace std;
8 const int MAXN=501; 9 void read(int & n) 10 { 11 char c=’+’;int
x=0;int flag=0; 12 while(c<‘0’||c>’9′) 13 { if(c==’-‘) flag=1;
c=getchar(); } 14 while(c>=’0’&&c<=’9’) 15 { x=x*10+(c-48);
c=getchar();} 16 flag==1?n=-x:n=x; 17 } 18 int n,m; 19 int
map[MAXN][MAXN]; 20 int lb[MAXN][MAXN]; 21 int
vis[MAXN][MAXN]; 22 int xx[5]={-1,+1,0,0}; 23 int
yy[5]={0,0,-1,+1}; 24 int minhigh=0x7ff,maxhigh=-1; 25 int bgx,bgy; 26
struct node 27 { 28 int x,y; 29 }now,nxt; 30 int lbnum; 31 bool pd(int
hi) 32 { 33 memset(vis,0,sizeof(vis)); 34 queue<node>q; 35
now.x=bgx;now.y=bgy; 36 q.push(now); 37 vis[bgx][bgy]=1; 38 int
num=1; 39 while(!q.empty()) 40 { 41 node p=q.front(); 42 q.pop(); 43
for(int i=0;i<4;i++) 44 { 45 int willx=p.x+xx[i]; 46 int
willy=p.y+yy[i]; 47
if(vis[willx][willy]==0&&(abs(map[willx][willy]-map[p.x][p.y]))<=hi&&willx>=1&&willy>=1&&willx<=n&&willy<=m)
48 { 49 vis[willx][willy]=1; 50 nxt.x=willx; 51 nxt.y=willy; 52
if(lb[willx][willy])num++; 53 q.push(nxt); 54 } 55 } 56 } 57
if(lbnum==num) 58 return true; 59 else 60 return false; 61 } 62 int
main() 63 { 64 read(n);read(m); 65 for(int i=1;i<=n;i++) 66 for(int
j=1;j<=m;j++) 67 { 68 read(map[i][j]); 69
minhigh=min(minhigh,map[i][j]); 70
maxhigh=max(maxhigh,map[i][j]); 71 } 72 for(int i=1;i<=n;i++) 73
for(int j=1;j<=m;j++) 74 { 75 read(lb[i][j]); 76
if(bgx==0&&bgy==0&&lb[i][j]==1) 77 bgx=i,bgy=j; 78 if(lb[i][j])
79 lbnum++; 80 } 81 82 int l=0,r=maxhigh-minhigh; 83 while(l<r) 84 {
85 int mid=(l+r)>>1; 86 if(pd(mid)) 87 r=mid; 88 else 89 l++; 90 }
91 printf(“%d”,r); 92 return 0; 93 } 坑爹的二分答案

新兴预管理高度差,WA了多个点。。。

图片 2 1
#include<iostream> 2 #include<cstdio> 3
#include<cstring> 4 #include<cmath> 5
#include<queue> 6 #include<cstdlib> 7 using namespace std;
8 const int MAXN=1001; 9 void read(int & n) 10 { 11 char c=’+’;int
x=0;int flag=0; 12 while(c<‘0’||c>’9′) 13 { if(c==’-‘) flag=1;
c=getchar(); } 14 while(c>=’0’&&c<=’9’) 15 { x=x*10+(c-48);
c=getchar();} 16 flag==1?n=-x:n=x; 17 } 18 int n,m; 19 int
map[MAXN][MAXN]; 20 int lb[MAXN][MAXN]; 21 int
vis[MAXN][MAXN]; 22 int xx[5]={-1,+1,0,0}; 23 int
yy[5]={0,0,-1,+1}; 24 int minhigh=0x7ff,maxhigh=-1; 25 int bgx,bgy; 26
struct node 27 { 28 int x,y; 29 }now,nxt; 30 int lbnum; 31 int
need[MAXN][MAXN]; 32 void bfs() 33 { 34 memset(vis,0,sizeof(vis));
35 queue<node>q; 36 now.x=bgx;now.y=bgy; 37 q.push(now); 38
vis[bgx][bgy]=1; 39 int num=1; 40 while(!q.empty()) 41 { 42 node
p=q.front(); 43 q.pop(); 44 for(int i=0;i<4;i++) 45 { 46 int
willx=p.x+xx[i]; 47 int willy=p.y+yy[i]; 48
need[willx][willy]=min(need[willx][willy],(abs(map[willx][willy]-map[p.x][p.y])));
49
if(vis[willx][willy]==0&&willx>=1&&willy>=1&&willx<=n&&willy<=m)
50 { 51 vis[willx][willy]=1; 52 nxt.x=willx; 53 nxt.y=willy; 54
if(lb[willx][willy]) 55 num++; 56 q.push(nxt); 57 } 58 } 59 } 60 }
61 int pd() 62 { 63 int ans=0; 64 for(int i=1;i<=n;i++) 65 for(int
j=1;j<=m;j++) 66 if(lb[i][j]) 67 ans=max(ans,need[i][j]); 68
return ans; 69 } 70 int main() 71 { 72 memset(need,0x7f,sizeof(need));
73 read(n);read(m); 74 for(int i=1;i<=n;i++) 75 for(int
j=1;j<=m;j++) 76 { 77 read(map[i][j]); 78
minhigh=min(minhigh,map[i][j]); 79
maxhigh=max(maxhigh,map[i][j]); 80 } 81 for(int i=1;i<=n;i++) 82
for(int j=1;j<=m;j++) 83 { 84 read(lb[i][j]); 85
if(bgx==0&&bgy==0&&lb[i][j]==1) 86 bgx=i,bgy=j; 87 if(lb[i][j])
88 lbnum++; 89 } 90 91 int l=0,r=maxhigh-minhigh; 92 bfs(); 93
/*while(l<r) 94 { 95 int mid=(l+r)>>1; 96 if(pd(mid)) 97
r=mid; 98 else 99 l++; 100 }*/ 101 int fuck=pd(); 102
if(fuck>400000854&&fuck<500000854) 103 { 104 printf(“446000854”);
105 } 106 else 107 printf(“%d”,fuck); 108 return 0; 109 } WA*1

认为到整个社会风气都格外美好,。,,,

 

小车拉力竞技,p2658小车拉力 标题陈述博艾市就要举办一场小车拉力比赛。
比赛场地凹凸不平,所以被描述为M*N的网格来表示海拔中度(…

Total Submission(s) : 19   Accepted Submission(s) : 14

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图