2018 Multi-University Training Contest 9

Rikka with Nash Equilibrium

题意:

  定义pure strategy Nash equilibriums为矩阵中的一个数并且该数为所在行和列的最大值。现在要求构造一个矩阵,满足【1,n*m】中的每个数出现且只出现一次在矩阵中,并且矩阵至多只有一个pure strategy Nash equilibriums。问可以构造多少个满足上述条件的矩阵?

分析:

  首先很容易想到的是从大到小放置这些值并且之后的数要放在之前的数占据的行和列上,因为在这种策略下,当前的数必定不是它所在行和列的最大值(除了n*m),那么就保证矩阵中至多出现一个pure strategy Nash equilibriums。考虑用dp【i】【j】【k】表示放置了i个数占据j行k列的方案数,不难看出当我们放置一个数后,只可能出现当前占据的行+1,当前占据的列+1或者当前占据的行和列都不变三种情况(不可能同时+1是因为前面规定了之后的数必须放在之前的数占据的行和列上),然后依次递推下去,最后答案的解就是dp【n*m】【n】【m】。

  参考博客:大佬博客

代码:

#include <queue>
#include <vector>
#include <math.h>
#include <string>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;
#define ll long long
#define ull unsigned long long
#define cls(x) memset(x,0,sizeof(x))
#define clslow(x) memset(x,-1,sizeof(x))

const int maxn=81;

int n,m,mod,T;

ll dp[maxn*maxn][maxn][maxn];

void add(ll& a,ll b)
{
    a+=b;
    while(a>=mod)    a-=mod;
}

int main()
{
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif // ONLINE_JUDGE
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d %d",&n,&m,&mod);

        cls(dp);
        dp[1][1][1]=n*m;
        for(int i=1;i<n*m;i++){
            for(int j=1;j<=n;j++){
                for(int k=1;k<=m;k++){
                    if(max(j,k)>i)  break;
                    if(!dp[i][j][k])    continue;
                    //如果行+1,首先考虑放在哪一列,然后考虑该列上一共有多少未被占据的行
                    if(j<n) add(dp[i+1][j+1][k],dp[i][j][k]*k%mod*(n-j)%mod);
                    //列同理
                    if(k<m) add(dp[i+1][j][k+1],dp[i][j][k]*j%mod*(m-k)%mod);
                    //行列都被占据的位置一共有j*k个,去掉之前放置的数的位置个数i
                    if(i<j*k)   add(dp[i+1][j][k],dp[i][j][k]*(j*k-i)%mod);
                }
            }
        }
        printf("%lld\n",dp[n*m][n][m]);
    }
    return 0;
}

Rikka with Stone-Paper-Scissors

题意:

  Yuta有a个剪刀卡片,b个石头卡片,c个布卡片,Rikka有a1个剪刀卡片,b1个石头卡片,c1个布卡片(a+b+c=a1+b1+c1),每次猜拳前Rikka都知道Yuta每种卡片的数量,在采取最优策略的条件下,问Rikka赢比赛的次数的期望是多少?

分析:

  考虑对于Rikka和Yuta对局的所有情况中,对于一方的一张卡片都会和对方的所有卡片组合(a+b+c),在这(a+b+c)种情况中,每赢一局则相当于对答案贡献了1/(a+b+c),输一局则贡献-1/(a+b+c)。那么对于总体,求出一共有多少种赢的情况和输的情况即可。

代码:

#include <map>
#include <queue>
#include <math.h>
#include <string>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;
#define ll long long
#define ull unsigned long long
#define cls(x) memset(x,0,sizeof(x))
#define clslow(x) memset(x,-1,sizeof(x))

const int maxn=1e5+100;

ll a[10],b[10];

int main()
{
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif // ONLINE_JUDGE
    int T;
    scanf("%d",&T);
    while(T--)
    {
        for(int i=1;i<=3;i++)   scanf("%lld",&a[i]);
        for(int i=1;i<=3;i++)   scanf("%lld",&b[i]);

        ll res=0,sum=0;
        ll win=0,lose=0;
        for(int i=1;i<=3;i++){
            sum+=a[i];
            lose=b[i]*a[i+1>3?1:i+1];
            win=b[i]*a[i-1<1?3:i-1];
            res+=win-lose;
        }
        ll gcd=__gcd(res,sum);
        res/=gcd;sum/=gcd;
        if(res>0&&sum<0){
            res=-res;
            sum=-sum;
        }
        if(res%sum==0)  printf("%lld\n",res/sum);
        else            printf("%lld/%lld\n",res,sum);
    }
    return 0;
}

Rikka with Badminton

题意:

  已知有a个学生没有球也没有拍,b个学生只有拍,c个学生只有球,d个学生有球又有拍。现在安排学生去参赛,比赛成功举办的条件是至少有两个拍和一个球,现在问一共有多少种安排方案使得比赛举办失败?

分析:

  对于每一种情况都讨论一下,最后去掉重复计算的情况。

代码:

#include <map>
#include <queue>
#include <math.h>
#include <string>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;
#define ll long long
#define ull unsigned long long
#define cls(x) memset(x,0,sizeof(x))
#define clslow(x) memset(x,-1,sizeof(x))

const int maxn=1e5+100;
const int mod=998244353;

int T;
ll a,b,c,d;

ll poww(ll a,ll k)
{
    ll res=1;
    while(k)
    {
        if(k&1) res=res*a%mod;
        a=a*a%mod;
        k>>=1;
    }
    return res;
}

int main()
{
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif // ONLINE_JUDGE
    scanf("%d",&T);
    while(T--)
    {
        ll ans=1;
        scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
        ///没拍没球
        ans=(ans+poww(2,a)-1)%mod;
        ///有拍没球
        ans=(ans+(poww(2,b)-1)*poww(2,a)%mod)%mod;
        ///没拍有球
        ans=(ans+(poww(2,c)-1)*poww(2,a)%mod)%mod;
        ///有拍有球
        ans=(ans+d*poww(2,a+c)%mod+b*poww(2,a+c)%mod)%mod;
        ans=(ans-b*poww(2,a)%mod+mod)%mod;
        printf("%lld\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/shutdown113/p/9542340.html

时间: 2024-10-19 02:02:19

2018 Multi-University Training Contest 9的相关文章

2018 Nowcoder Multi-University Training Contest 2

Practice Link A. run 题意: 白云每次可以移动\(1\)米或者\(k\)米,询问移动的米数在\([L, R]\)范围内的方案数有多少. 思路: \(dp[i][2]\)表示到第\(i\)米,是通过\(1\)米的方式过来的还是\(k\)米的方式过来的,递推即可. 代码: #include <bits/stdc++.h> using namespace std; #define N 100010 const int p = 1e9 + 7; int f[N][2], g[N];

2018 Nowcoder Multi-University Training Contest 1

Practice Link J. Different Integers 题意: 给出\(n\)个数,每次询问\((l_i, r_i)\),表示\(a_1, \cdots, a_i, a_j, \cdots, a_n\)中有多少个不同的数. 思路: 先分别离线求出\(a_1, \cdots a_i\)以及\(a_j, \cdots, a_n\)中有多少个不同的数. 再考虑有多少个数既在\([1, i]\)中也在\([j, n]\)中,再离线做一次. 考虑一个数第一次出现的时候,那么这个数下一次出现

2018 Nowcoder Multi-University Training Contest 5

Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ \begin{eqnarray*} gpa = \frac{\sum s_ic_i}{\sum s_i} \end{eqnarray*} \] 思路: 首先删去的课程越多,gpa肯定不会变得更差. 所以我们肯定是删去\(k\)门课程. 考虑二分答案,check的时候要满足: \[ \begin{eq

HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】

任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 5943    Accepted Submission(s): 2004 Problem Description Before

杭电2018多校第一场(2018 Multi-University Training Contest 1) 1001.Maximum Multiple (HDU6298)-数学思维题(脑子是个好东西,可惜我没有)

暑假杭电多校第一场,这一场是贪心场,很多贪心的题目,但是自己太菜,姿势挫死了,把自己都写吐了... 2018 Multi-University Training Contest 1 HDU6298.Maximum Multiple 题目意思就是给你一个n,找出来三个数x,y,z, 使得n=x+y+z,而且x,y,z都是n的因数,并且x*y*z为最大值,让你输出来x*y*z的最大值.如果没有满足条件的情况就输出-1. 由1=1/2+1/3+1/6=1/3+1/3+1/3=1/2+1/4+1/4,所

2018 Multi-University Training Contest 4

Problem D. Nothing is Impossible Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 504    Accepted Submission(s): 302 Problem Description m students, including Kazari, will take an exam tomorrow

HDU 6396 Swordsman --------2018 Multi-University Training Contest 7 (模拟+读入挂)

原题地址: 打怪升级 一开始有N个怪物:主角有K个能力:只有K个能力都击败怪物才能斩杀怪物并获得K个能力的增值:问最多能杀几个怪物: 做法: 用优先队列把怪物能力装进去:能力小放前面: 最重要的是数据量要用读入挂才能过:(读入挂太神奇了!!) Swordsman Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2049    Acce

2018 Multi-University Training Contest 3

2018 Multi-University Training Contest 2 题解 A - Problem A. Ascending Rating 题目描述:给定一个序列,分别求出所有长度为\(m\)的区间的\(maxrating, count\),对于每个长度为\(m\)的区间,一开始\(maxrating=-1, count=0\),然后从左往右扫,扫到一个大于\(maxrating\)的值时,\(count+1, maxrating=\)那个数. solution 从左往右做,用单调队

2018 Multi-University Training Contest 1 Distinct Values 【贪心 + set】

任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6301 Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5312    Accepted Submission(s): 1823 Problem Description Chiaki has an array of

2018 Multi-University Training Contest 4 Problem L. Graph Theory Homework 【YY】

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6343 Problem L. Graph Theory Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1536    Accepted Submission(s): 830 Problem Description Ther