magic balls

探讨了在一个小镇上,居民使用两种魔法球,并通过有限次交换体积来形成最长递增序列的问题。采用动态规划算法解决,涉及能量限制条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

The town of W has N people. Each person takes two magic balls A and B every day. Each ball has the volume aiai and bibi. People often stand together. The wizard will find the longest increasing subsequence in the ball A. The wizard has M energy. Each point of energy can change the two balls’ volume.(swap(ai,bi)swap(ai,bi)).The wizard wants to know how to make the longest increasing subsequence and the energy is not negative in last. In order to simplify the problem, you only need to output how long the longest increasing subsequence is.
Input
The first line contains a single integer T(1≤T≤20)T(1≤T≤20)(the data for N>100N>100 less than 6 cases), indicating the number of test cases.
Each test case begins with two integer N(1≤N≤1000)N(1≤N≤1000) and M(0≤M≤1000)M(0≤M≤1000),indicating the number of people and the number of the wizard’s energy. Next N lines contains two integer aiai and bi(1≤ai,bi≤109)bi(1≤ai,bi≤109),indicating the balls’ volume.
Output
For each case, output an integer means how long the longest increasing subsequence is.
Sample Input
2
5 3
5 1
4 2
3 1
2 4
3 1
5 4
5 1
4 2
3 1
2 4
3 1
Sample Output
4
4

思路:这个题是最长递增序列问题,其中不同的一点是,A和B可以交换(有限制),可以用动态规划来实现。对于每个人来说,可以按A球或B球来计算分。分别用alen[]和blen[]数组来存。第i个人的球如果是用A球算,前i个人的总volume用alen[i]表示,ac[i]表示其进行的swap次数,第i个人的球如果按B球算,前i个人的volume用blen[i]表示,bc[i]表示其进行的swap次数。
转移方程:
(1)Aj+A
(2)Bj+A
(3)Aj+B
(4)Bj+B

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

#define N 1005
int a[N],b[N],ac[N],bc[N],alen[N],blen[N];
//ac表swap次数,alen表volume。
int main(){
    int t,n,m;
    cin>>t;
    while(t--){
        cin>>n>>m;
        for(int i=0;i<n;i++){
            cin>>a[i]>>b[i];
        }
        for(int i=0;i<n;i++){
            ac[i]=0;
            bc[i]=0;
        }
        for(int i=0;i<n;i++){
            alen[i]=1;
            for(int j=0;j<i;j++){
                if(a[j]<a[i] && (alen[j]+1)>alen[i]){
                    alen[i]=alen[j]+1;
                    ac[i]=ac[j];
                } 
                if(b[j]<a[i] && (blen[j]+1)>alen[i]){
                    alen[i]=blen[j]+1;
                    ac[i]=bc[j];
                }
            }
            blen[i]=1;
            bc[i]=1;
            for(int j=0;j<i;j++){
                if(a[j]<b[i] && (alen[j]+1)>blen[i] && ac[j]<m){
                    blen[i]=alen[j]+1;
                    bc[i]=ac[j]+1;
                }
                if(b[j]<b[i] && (blen[j]+1)>blen[i] && bc[j]<m){
                    blen[i]=blen[j]+1;
                    bc[i]=bc[j]+1;
                }
            }

        }
        int max=alen[0];
        for(int i=0;i<n;i++){
            if(max<alen[i]) max=alen[i];
            if(max<blen[i]) max=blen[i];
        }
        cout<<max<<endl;
    }
    return 0;
}

///       2 6 3 5 1 4 2 3 1 2 4 3 1 4 5 
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>双色球数据分析与预测</title> <link rel="stylesheet" href="https://s2.ssl.qhres2.com/static/56662140ef7d5d03.css"> <link rel="stylesheet" href="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-100-M/font-awesome/6.0.0/css/all.min.css"> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <style> :root { --primary-white: #f9f9f9; --primary-green: #8daa92; --primary-dark: #333333; --primary-gray: #666666; --accent-green: #5a8f6a; --shadow-light: rgba(0, 0, 0, 0.05); --shadow-medium: rgba(0, 0, 0, 0.1); --red-ball: #e74c3c; --blue-ball: #3498db; } body { font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; background-color: var(--primary-white); color: var(--primary-dark); line-height: 1.6; margin: 0; padding: 0; min-height: 100vh; display: flex; flex-direction: column; } .container { max-width: 1200px; margin: 0 auto; padding: 0 2rem; } header { background-color: var(--primary-white); padding: 2rem 0; border-bottom: 1px solid var(--shadow-light); position: relative; overflow: hidden; } .header-content { display: flex; justify-content: space-between; align-items: center; } .logo { font-size: 1.8rem; font-weight: bold; color: var(--accent-green); display: flex; align-items: center; } .logo i { margin-right: 0.5rem; color: var(--primary-green); } nav ul { display: flex; list-style: none; gap: 2rem; } nav a { text-decoration: none; color: var(--primary-gray); font-weight: 500; transition: color 0.3s; position: relative; } nav a:hover { color: var(--accent-green); } nav a::after { content: ""; position: absolute; bottom: -0.5rem; left: 0; width: 0; height: 2px; background-color: var(--accent-green); transition: width 0.3s; } nav a:hover::after { width: 100%; } .hero { text-align: center; padding: 4rem 0; margin-bottom: 3rem; } .hero h1 { font-size: 2.5rem; margin-bottom: 1.5rem; color: var(--primary-dark); font-weight: 600; } .hero p { font-size: 1.2rem; color: var(--primary-gray); max-width: 800px; margin: 0 auto 2rem; } .section-title { font-size: 2rem; margin-bottom: 2rem; color: var(--accent-green); position: relative; display: inline-block; } .section-title::after { content: ""; position: absolute; bottom: -0.5rem; left: 0; width: 60%; height: 2px; background-color: var(--primary-green); } .chart-container { background-color: white; border-radius: 0.5rem; box-shadow: 0 4px 6px var(--shadow-light); padding: 2rem; margin-bottom: 3rem; transition: transform 0.3s, box-shadow 0.3s; } .chart-container:hover { transform: translateY(-5px); box-shadow: 0 10px 15px var(--shadow-medium); } .data-section { padding: 3rem 0; } .data-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; margin-top: 2rem; } .data-card { background-color: white; border-radius: 0.5rem; box-shadow: 0 4px 6px var(--shadow-light); padding: 1.5rem; transition: all 0.3s ease; } .data-card:hover { transform: translateY(-3px); box-shadow: 0 6px 12px var(--shadow-medium); } .card-title { font-size: 1.25rem; color: var(--accent-green); margin-bottom: 1rem; display: flex; align-items: center; } .card-title i { margin-right: 0.5rem; } .prediction-section { background: linear-gradient(135deg, #f8fff9 0%, #e6f7e9 100%); border-left: 4px solid var(--accent-green); padding: 2rem; margin: 2rem 0; border-radius: 0 0.5rem 0.5rem 0; } .number-balls { display: flex; flex-wrap: wrap; gap: 0.8rem; margin: 1.5rem 0; justify-content: center; } .ball { width: 50px; height: 50px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: bold; font-size: 1.2rem; color: white; box-shadow: 0 4px 6px rgba(0,0,0,0.1); transition: transform 0.3s; } .ball:hover { transform: scale(1.1); } .red-ball { background: radial-gradient(circle at 30% 30%, var(--red-ball), #c0392b); } .blue-ball { background: radial-gradient(circle at 30% 30%, var(--blue-ball), #2980b9); } .probability-bars { display: flex; flex-direction: column; gap: 0.8rem; margin-top: 1.5rem; } .probability-item { display: flex; align-items: center; } .number-label { width: 30px; text-align: center; font-weight: bold; } .bar-container { flex-grow: 1; height: 24px; background-color: #e0e0e0; border-radius: 12px; overflow: hidden; margin: 0 1rem; } .bar-fill { height: 100%; border-radius: 12px; transition: width 1s ease-out; } .red-fill { background: linear-gradient(to right, #f5b7b1, var(--red-ball)); } .blue-fill { background: linear-gradient(to right, #aed6f1, var(--blue-ball)); } .percentage { width: 50px; text-align: right; font-weight: 500; } .prediction-actions { display: flex; justify-content: center; gap: 1rem; margin-top: 2rem; } .btn { padding: 0.8rem 1.5rem; border-radius: 50px; border: none; font-weight: 600; cursor: pointer; transition: all 0.3s; display: flex; align-items: center; } .btn i { margin-right: 0.5rem; } .btn-primary { background: linear-gradient(to right, var(--primary-green), var(--accent-green)); color: white; } .btn-outline { background: transparent; border: 2px solid var(--accent-green); color: var(--accent-green); } .btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px var(--shadow-medium); } .disclaimer { font-size: 0.9rem; color: var(--primary-gray); margin-top: 2rem; text-align: center; font-style: italic; } footer { background-color: var(--primary-dark); color: white; padding: 3rem 0; margin-top: auto; } @media (max-width: 768px) { .header-content { flex-direction: column; gap: 1rem; } nav ul { gap: 1rem; flex-wrap: wrap; justify-content: center; } .ball { width: 42px; height: 42px; font-size: 1rem; } } </style> </head> <body> <header> <div class="container"> <div class="header-content"> <div class="logo"> <i class="fas fa-chart-line"></i> 双色球数据分析 </div> <nav> <ul> <li><a href="#"><i class="fas fa-home"></i> 首页</a></li> <li><a href="#"><i class="fas fa-history"></i> 历史数据</a></li> <li><a href="#"><i class="fas fa-calculator"></i> 概率分析</a></li> <li><a href="#"><i class="fas fa-magic"></i> 号码预测</a></li> <li><a href="#"><i class="fas fa-question-circle"></i> 帮助</a></li> </ul> </nav> </div> </div> </header> <main class="container"> <section class="hero"> <h1>双色球数据分析与预测系统</h1> <p>基于历史数据分析和概率模型,提供科学的双色球号码预测服务</p> </section> <section class="data-section"> <h2 class="section-title">下期号码预测</h2> <div class="prediction-section"> <h3>第2025091期预测号码</h3> <p>根据历史数据和算法模型生成的推荐号码(更新于2025年8月10日)</p> <div class="number-balls"> <div class="ball red-ball">03</div> <div class="ball red-ball">11</div> <div class="ball red-ball">17</div> <div class="ball red-ball">22</div> <div class="ball red-ball">28</div> <div class="ball red-ball">31</div> <div class="ball blue-ball">09</div> </div> <div class="prediction-actions"> <button class="btn btn-primary"> <i class="fas fa-sync-alt"></i> 重新生成 </button> <button class="btn btn-outline"> <i class="fas fa-download"></i> 保存号码 </button> </div> </div> <div class="chart-container"> <h3><i class="fas fa-fire"></i> 红球热号分析</h3> <canvas id="redBallChart"></canvas> </div> <div class="chart-container"> <h3><i class="fas fa-snowflake"></i> 蓝球冷号分析</h3> <canvas id="blueBallChart"></canvas> </div> <div class="data-grid"> <div class="data-card"> <h3 class="card-title"><i class="fas fa-star"></i> 高频红球</h3> <div class="probability-bars"> <!-- 红球概率条 --> <div class="probability-item"> <div class="number-label">08</div> <div class="bar-container"> <div class="bar-fill red-fill" style="width: 78%"></div> </div> <div class="percentage">78%</div> </div> <div class="probability-item"> <div class="number-label">17</div> <div class="bar-container"> <div class="bar-fill red-fill" style="width: 72%"></div> </div> <div class="percentage">72%</div> </div> <div class="probability-item"> <div class="number-label">22</div> <div class="bar-container"> <div class="bar-fill red-fill" style="width: 68%"></div> </div> <div class="percentage">68%</div> </div> </div> </div> <div class="data-card"> <h3 class="card-title"><i class="fas fa-tint"></i> 蓝球概率</h3> <div class="probability-bars"> <!-- 蓝球概率条 --> <div class="probability-item"> <div class="number-label">09</div> <div class="bar-container"> <div class="bar-fill blue-fill" style="width: 65%"></div> </div> <div class="percentage">65%</div> </div> <div class="probability-item"> <div class="number-label">05</div> <div class="bar-container"> <div class="bar-fill blue-fill" style="width: 58%"></div> </div> <div class="percentage">58%</div> </div> <div class="probability-item"> <div class="number-label">12</div> <div class="bar-container"> <div class="bar-fill blue-fill" style="width: 52%"></div> </div> <div class="percentage">52%</div> </div> </div> </div> </div> <p class="disclaimer"> <i class="fas fa-exclamation-triangle"></i> 免责声明:本预测基于历史数据分析,不保证中奖概率。彩票有风险,投注需谨慎。 </p> </section> </main> <footer> <div class="container"> <p>© 2023 双色球数据分析系统 | 数据仅供参考</p> </div> </footer> <script> // 红球图表数据 const redBallData = { labels: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33'], datasets: [{ label: '出现频率', data: [12, 18, 22, 15, 19, 14, 20, 28, 16, 13, 25, 17, 11, 19, 16, 14, 26, 15, 18, 12, 17, 24, 16, 13, 19, 15, 20, 23, 14, 17, 21, 16, 12], backgroundColor: '#e74c3c', borderColor: '#c0392b', borderWidth: 1 }] }; // 蓝球图表数据 const blueBallData = { labels: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16'], datasets: [{ label: '出现频率', data: [8, 10, 7, 9, 14, 6, 11, 9, 13, 7, 8, 12, 5, 9, 11, 10], backgroundColor: '#3498db', borderColor: '#2980b9', borderWidth: 1 }] }; // 图表配置 const chartConfig = { type: 'bar', options: { responsive: true, scales: { y: { beginAtZero: true, title: { display: true, text: '出现次数' } } }, plugins: { legend: { display: false } } } }; // 初始化图表 window.onload = function() { const redCtx = document.getElementById('redBallChart').getContext('2d'); new Chart(redCtx, { ...chartConfig, data: redBallData }); const blueCtx = document.getElementById('blueBallChart').getContext('2d'); new Chart(blueCtx, { ...chartConfig, data: blueBallData }); // 添加动画效果 document.querySelectorAll('.ball').forEach(ball => { ball.style.animation = 'popIn 0.6s ease-out'; }); }; // 重新生成按钮功能 document.querySelector('.btn-primary').addEventListener('click', function() { const balls = document.querySelectorAll('.ball'); // 添加消失动画 balls.forEach(ball => { ball.style.animation = 'popOut 0.4s forwards'; }); // 延迟后生成新号码 setTimeout(() => { generateNewNumbers(); balls.forEach(ball => { ball.style.animation = 'popIn 0.6s forwards'; }); }, 500); }); // 生成预测号码 function generateNewNumbers() { const redBalls = []; const blueBall = Math.floor(Math.random() * 16) + 1; // 生成6个不重复的红球 while(redBalls.length < 6) { const num = Math.floor(Math.random() * 33) + 1; if(!redBalls.includes(num)) { redBalls.push(num); } } // 排序红球 redBalls.sort((a, b) => a - b); // 更新显示 const ballElements = document.querySelectorAll('.ball'); for(let i = 0; i < 6; i++) { ballElements[i].textContent = redBalls[i].toString().padStart(2, '0'); } ballElements.textContent = blueBall.toString().padStart(2, '0'); } </script> </body> </html> 以上内容由AI搜集并生成,仅供参考
08-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值