2018山东省赛补题

题目链接 https://www.nowcoder.com/acm/contest/123/E

题解 https://www.cnblogs.com/Rubbishes/p/9074460.html

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1000005;
int cnt[MAXN];
int main()
{
    int t;
    while(~scanf("%d",&t))
    {
        while(t--)
        {
            int n; scanf("%d",&n);
            int min1=MAXN,min2=MAXN;
            for(int i=0;i<n;i++)
            { // cnt[i] 表示删除i后会减少的good数的数量
                int x; scanf("%d",&x); cnt[x]=0;
                if(min1<x && x<min2) cnt[min1]++;
                // x确定是因min1而成为一个good数
                // 删除min1 就会少了x这个good数
                if(min1<x) cnt[x]++;
                // x确定是一个good数
                // 删除x 至少会少了其本身这个good数
                if(x<min1) min2=min1,min1=x;
                else if(x<min2) min2=x;
            }
            int mini=MAXN,ans;
            for(int i=1;i<=n;i++)
            { // 选出cnt[i]最小的即可
                if(cnt[i]==mini) ans=min(ans,i);
                else if(cnt[i]<mini) mini=cnt[i], ans=i;
            }
            printf("%d\n",ans);
        }
    }

    return 0;
}

G Games

题目链接 https://www.nowcoder.com/acm/contest/123/G

题解 https://www.cnblogs.com/Rubbishes/p/9069601.html

解题思路和代码看链接的小哥哥的博客就好

这里放另一份题解代码

#include <bits/stdc++.h>
using namespace std;
int dp[1005][15][1050],a[1005];
const int MOD=1e9+7;
int main()
{
    int t; scanf("%d",&t);
    while(t--)
    {
        int n,d; scanf("%d%d",&n,&d);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);

        memset(dp,0,sizeof(dp));
        dp[1][0][a[1]]=dp[1][1][0]=1;
        /// 这里dp[i][j][k]表示 当处在第i堆时拿掉j堆为k状态的方案数
        // 所以一开始位于第一堆时
        // 拿掉0堆(就是不拿) 状态即为a[1]
        // 拿掉1堆(就只能拿第一堆) 状态即为0

        for(int i=2;i<=n;i++) // 第一堆的情况已经处理过 直接从2~n
            for(int j=0;j<=min(d,i);j++) // 最多拿d堆 不满d堆则拿i堆
                for(int k=0;k<=1024;k++) // 遍历所有状态
                    dp[i][j][k]=(dp[i-1][j][k^a[i]]%MOD+
                                 dp[i-1][j-1][k]%MOD)%MOD;
        /// 处于第i堆拿掉j堆状态为k的方案数则可由
        /// 处于第i-1堆时 已拿掉j堆 状态已为k的 和
        /// 处于第i-1堆时 拿掉j-1堆 状态为k^a[i]的 相加得到
        // 也就是再拿一堆则满j堆时 拿的这一堆直接拿当前处于的这堆(即第i堆)

        /// 如此递推 则到第n堆时所有状态为0 的方案数即为答案
        int ans=0;
        for(int i=0;i<=d;i++)
            ans=(ans+dp[n][i][0])%MOD;
        printf("%d\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/zquzjx/p/9091244.html

时间: 2024-07-31 06:41:15

2018山东省赛补题的相关文章

第十届山东省acm省赛补题(2)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4124 L Median Time Limit: 1 Second      Memory Limit: 65536 KB Recall the definition of the median of  elements where  is odd: sort these elements and the median is the -th largest element.

[水]浙大校赛补题

本来以为会巨难无比又有别的比赛可以打于是赛后补题,结果发现似乎略水,反正是找到了四个水题先贴下来 ZOJ-4099 J #include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int t; ll x, y, n; int main() { cin >> t; while (t--) { scanf("%lld

2018-2019赛季多校联合新生训练赛第六场(2018/12/15)补题题解

A 价钱统计(基础编程能力) 这个考点还是比较个性的,怎么四舍五入 解法 常规的讲如果四舍五入整数位的话,那么只需要在后面加个0.5然后强制转换一下就可以了 这个却要我们保留一位小数的四舍五入,那该怎么做呢 实际上我们只需要把这个数乘以10然后加0.5,强制转换后再除以10就可以了 代码 #include <bits/stdc++.h> using namespace std; double trans(double a) { a*=10; a+=0.5; a=int(a); a/=10; r

2018-2019赛季多校联合新生训练赛第八场(2018/12/22)补题题解

感慨 这次有点感冒,昏迷程度比较大中途还溜了 感谢 感谢qut的同学的帮助!!! A 小X与三角形(数学) 公式 两边的和-两边的差-1 因为边最小得大于两边的差,边最大得小于两边的和所以说求得是一个开区间内元素的个数 代码 #include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll a,

2018湖南省赛B题“2018”

题面懒得敲了,反正看这篇博客的肯定知道题面. 比赛时想按约数的一些性质分情况讨论出公式然后在合并,结果单考虑矩阵里出现2018和1009(与2互质,1009出现次数等于2)出现的情况就写了一长串公式,还推了很久.在考虑1出现的综合情况就直接GG了.. 然后想到打表,奈何队友卡H题很久,最终因时间原因放弃来做B的时候已经冷静不下来了,没能打表成功,于是今天决定补一手打表. 我首先敲了dfs暴搜二维数组的,然后类比的(找了半天BUG)终于成功打出来了..还是要好好练练打表,比赛卡这样的题真难受. 1

2018山东省赛 E Sequence ( 思维 )

题目链接 题意 : 给出一个排列,让你删除一个数,使得删除后整个序列的 Good 数数量最多.Good 数的定义为 若 Ai 为 Good 则存在 Aj < Ai ( j < i ) 分析 :  画画几个规律就能得出如下几个结论 ① 若删除一个 Good 数,则原序列 Good 数的数量只会减一,即只会影响到这个 Good 数本身 这个也不难证明,若 Ai 是 Good 数,则存在  Aj < Ai ( j < i ) 考虑当前有 Good 数 Ak 因删除 Ai 而变成非 Goo

2018陕西省赛K题[watermelon_planting]

题意:有一个序列a[],描述的是另一个序列ans[]每个位置单位时间的增量.每个单位时间每个位置都会增加一个单位对应增量.时间总长m,每个单位时间包含有两种操作中的一个:1.询问ans[]在[l,r]区间的和:2.修改:a[]在[l,r]区间+1,即[l,r]区间的ans[]增量+1,a[i], n,m?≤?10^5 题解:当时脑抽没想出来,现在觉得好简单...考虑对每个位置,维护一个关于时间的一次函数y=a*x+b,y:是这个位置的答案,x:是时间,然后就维护两个系数a,b就可以了.维护的方法

8月5号团队赛补题

1.Commentary Boxes Description Berland Football Cup starts really soon! Commentators from all over the world come to the event. Organizers have already built nn commentary boxes. mm regional delegations will come to the Cup. Every delegation should g

2016 杭州区域赛补题

A - ArcSoft's Office Rearrangement HDU - 5933 题意:现在有n个办公区,每个办公区内有a[i]个办公人员,现在要将这些人均匀的分布在m个办公区内,每个办公区人员必须等价.现在有两个操作,1操作,可以将相邻的两个区域的人员结合在一起,2操作可以将一个办公区的人员,随意划分成两部分,两部分不一定平均,问最少需要多少次操作. 做法:贪心,从前向后枚举,不可以的情况就是不能平均的,可以预处理出来平均值,对于可以的情况,如果比平均值小,就直接加在后一个办公区内,