UVALive 5111 Soccer Teams (动态规划)

题意:给指定数量的数字“1”,“2”,“3”……,“9”。用所有这些数字加上任意个0组成一个数,要求数能被11整除,且数的位数尽量小。

能被11整除的数有一个特点,奇数位数字之和与偶数位之和的差为11的倍数。

所以想到把所有数字分成两部分,即奇数位部分和偶数位部分,两部分的差相0即能被11整除(MOD 11)。

所求可以化为,其中一部分%11的余数为所有数字之和%11的余数的一半。

dp[k][r] := 能否找到 任意k个数之和 %11 == R

#include<bits/stdc++.h>
using namespace std;

int dig[12];
bool dp[105][12];

int main()
{
    int t;
    scanf("%d", &t);
    while (t--) {
        int n   = 0;    //数字个数
        int sum = 0;    //所有数字之和
        memset(dp, 0, sizeof dp);
        for (int i = 1; i <= 9; ++i) {
            scanf("%d", dig + i);
            n += dig[i];
            sum += dig[i] * i;
        }
        int m = sum % 11;
        if (m & 1) m += 11;
        m /= 2;
        dp[0][0] = true;

        for (int i = 1; i <= 9; ++i) {
            for (int j = 0; j < dig[i]; ++j) {
                for (int k = n; k >= 1; --k) {
                //for (int k = 1; k <= n; ++k) {
                    for (int r = 0; r < 11; ++r) {
                        dp[k][r] |= dp[k - 1][(r - i + 11) % 11];
                    }
                }
            }
        }
        int flag = 1;
        for (int i = n / 2; i >= 0; --i) {
            if (dp[i][m]) {
                printf("%d\n", n + max(n - i - 1 - i, 0));
                flag = 0;
                break;
            }
        }
        if (flag) {
            printf("-1\n");
        }
    }
    return 0;
}

  

时间: 2024-10-10 13:13:10

UVALive 5111 Soccer Teams (动态规划)的相关文章

UVALive 4887 Soccer 状压+模拟

题目链接:点击打开链接 题意:n个球队,m场比赛 下面n行表示n个球队的名字. 下面m场比赛表示该场比赛的2个队得分. -1表示我们可以任意填. 这种任意填的比赛场数不超过12场. 求: 胜一场球队得2分,平得1分,败得0分. 求每个球队最好名次与最差名字. 每场只有3个状态,最多只有12场,所以状压一下,3^12个状态. #include <cstdio> #include <algorithm> #include <cstring> #include <str

暑假集训-个人赛第四场

ID Origin Title   10 / 52 Problem A SPOJ AMR10A Playground     Problem B SPOJ AMR10B Regex Edit Distance     Problem C SPOJ AMR11C Robbing Gringotts   1 / 14 Problem D SPOJ AMR10D Soccer Teams   0 / 3 Problem E SPOJ AMR10E Stocks Prediction   17 / 19

KDD2015,Accepted Papers

Accepted Papers by Session Research Session RT01: Social and Graphs 1Tuesday 10:20 am–12:00 pm | Level 3 – Ballroom AChair: Tanya Berger-Wolf Efficient Algorithms for Public-Private Social NetworksFlavio Chierichetti,Sapienza University of Rome; Ales

【CF1133E】K Balanced Teams(动态规划,单调队列)

[CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素可以被分组. 题解 设\(f[i][j]\)表示把前\(i\)个数分成\(j\)组的最多人数. 然后单调队列转移一下完了. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring&g

【动态规划】UVALive - 4888 - Railroad

f(i,j)表示从A序列前面取i个,从B序列前面取j个时,能否拼成C序列.转移自行脑补. A train yard is a complex series of railroad tracks for storing, sorting, or loading/unloading railroad cars. In this problem, the railroad tracks are much simpler, and we are only interested in combining

UVALive 2324 Human Gene Functions(动态规划)

题意:求出将两个字符串改成一样长度所能形成最大的相似度. 思路:这个可以说是编辑距离的一个变形,编辑距离最终状态时要两个字符串完全一致,这个就是要求长度一样,而且这个只允许插入“—”这一个字符.模仿编辑距离定义状态,dp[i][j]表示将第一个字符串的前i个字符与第二个字符串的前j个字符变为相同长度所能形成的最大相似度.设两个字母的相似度为g[i][j]; 那状态转移为 dp[i][j] = max( dp[i][j-1] + g[j][5], d[i-1][j] + g[i][5],dp[i-

UVALive 6257 Chemist&#39;s vows --一道题的三种解法(模拟,DFS,DP)

题意:给一个元素周期表的元素符号(114种),再给一个串,问这个串能否有这些元素符号组成(全为小写). 解法1:动态规划 定义:dp[i]表示到 i 这个字符为止,能否有元素周期表里的符号构成. 则有转移方程:dp[i] = (dp[i-1]&&f(i-1,1)) || (dp[i-2]&&f(i-2,2))     f(i,k):表示从i开始填入k个字符,这k个字符在不在元素周期表中.  dp[0] = 1 代码: //109ms 0KB #include <ios

POJ 3071 Football (动态规划-概率DP)

Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2768   Accepted: 1412 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all teams still in the

[SinGuLaRiTy] 动态规划题目复习

[SinGuLaRiTy-1026] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [UVA 1025] A Spy in the Metro 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头.玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车站,她会有很大的被抓的风险,躲