B. Morning Jogging

B. Morning Jogging

在这里插入图片描述
在这里插入图片描述

Example

input

2
2 3
2 3 4
1 3 5
3 2
2 3
4 1
3 5

output

2 3 4
5 3 1
2 3
4 1
3 5

在这里插入图片描述

题目大意:
一个n行m列的数组,在每一行中任意交换数字,使得最终每一列的最小值之和最小。

思路:
贪心,把全部数升序排序,用前m个数填到每一列的某个数组里,剩下的位置按照数组里有的数字随便填。实现有点麻烦。

代码:

#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
#define AC 0
#define endl '\n'
#define Please return
#define int long long
using namespace std;
const int N=1e2+7;

int ans[N][N];
int b[10007];
map<int,int>ma[N];

signed main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        int k=0;
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=m;++j)
            {
                int a;
                cin>>a;
                b[++k]=a;
                ma[i][a]++;
            }
        }
        sort(b+1,b+k+1);
        int now=1;
        map<int,int>::iterator it;
        for(int i=1;i<=m;++i)//b里选前m个
        {
            for(int j=1;j<=n;++j)//当前列
            {
                if(ma[j].find(b[i])!=ma[j].end())//有这个元素
                {
                    ans[j][now++]=b[i];
                    ma[j][b[i]]--;
                    if(ma[j][b[i]]==0)ma[j].erase(b[i]);
                    break;
                }
            }
        }
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=m;++j)
            {
                if(ans[i][j]==0)//这里空着
                {
                    it=ma[i].begin();
                    ans[i][j]=it->first;
                    it->second--;
                    if(it->second==0)ma[i].erase(it);
                }
            }
        }
        for(int i=1;i<=n;++i)
        {
            ma[i].clear();
            for(int j=1;j<=m;++j)
            {
                cout<<ans[i][j]<<' ';
                ans[i][j]=0;//顺便初始化
            }
            cout<<endl;
        }
    }
    Please AC;
}

用几个样例试试就会发现,决定最终和最小的其实只是数组里的几个最小值,所以把它们分别放在每一列里,就可以构造出答案了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; public class Address extends JFrame { private String name; private String phone_Number; private String address; private String id; private String habit; private String[] btnTexts = { "Information 1", "Information 2", "Information 3" }; private String dialogMsg = "Your Name is:%s Your Phone_Number is:%s Your address is:%s Your id is:%s Your habit is:%s"; public Address() { setTitle("Address"); setSize(700, 700); setDefaultCloseOperation(EXIT_ON_CLOSE); setLayout(new BorderLayout()); add(new JButton("Choose Your Information"), BorderLayout.NORTH); add(new JButton("<<="), BorderLayout.WEST); JPanel panel = new JPanel(); panel.setBackground(Color.RED); panel.setLayout(new GridLayout(3, 1, 10, 10)); add(panel, BorderLayout.CENTER); for (String text : btnTexts) { JButton btn = new JButton(text); panel.add(btn); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String msg = String.format(dialogMsg, name, phone_Number, address, id, habit); JOptionPane.showMessageDialog(btn, msg); } }); } } public static void main(String[] args) { Address a = new Address(); a.setVisible(true); } } 将这段代码展现出的结果通过修改代码来达到美观化和高级化的目的
最新发布
05-18

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值