两道题目

咕咕咕!咕了很久的博客终于更新了!

CF720A Closing ceremony

题目大意

N×M个座位有N×M个人,一开始有 k人在(0,0)点上,l个人在(0,m+1)点上,问是否存在一种方案,使得每个人分配点与起始点的曼哈顿距离小于体力值,且每个人都有位置坐。

思路

贪心,考虑把两个起始点的人尽量往两个角塞

先把第一波人按照体力值从小到大排序

为什么不是从大到小排呢?如果体力值大的人把角落塞满了,体力值小的人又走不远,就没地方去了

然后先把位置先分配前 \(K\) 人(当然也可以先分配给后 \(L\) 人)。为了给后 \(L\) 人留够空间,分配时离 \((0, m+1)\) 点越远越好,若路程相同则选择离起点越远越好。

再分配后 \(L\) ,离起点越远越好。

若可行区间内节点都已选择,输出“NO”,否则输出“YES”。

(PS:这道题的算法标签为什么是排序、队列???)

Code(请勿Ctrl+C/V)

// Problem: CF720A Closing ceremony
// URL: https://www.luogu.com.cn/problem/CF720A
// Memory Limit: 250 MB
// Time Limit: 2000 ms
// Author: arlenWKX

# include <bits/stdc++.h>

using namespace std;

const int NM = 10005;

int n, m, k, l, a [ NM ], b [ NM ];
bool used [ NM ] [ NM ];

bool __CF720A__ ( );

int main ( )
{
	
	scanf ( "%d%d", & n, & m );
	
	scanf ( "%d", & k );
	for ( int i = 1; i <= k; i ++ ) scanf ( "%d", & a [ i ] );
	
	scanf ( "%d", & l );
	for ( int i = 1; i <= l; i ++ ) scanf ( "%d", & b [ i ] );
	
	sort ( a + 1, a + k + 1 );
	//sort ( b + 1, b + l + 1 );
	
	if ( __CF720A__ ( ) ) printf ( "YES" );
	else printf ( "NO" );
	
	return 0;
	
}

bool __CF720A__ ( )
{
	
	
	for ( int p = 1; p <= k; p ++ )
	{
		
		int xx, yy, ans1 = -1, ans2 = -1;
		
		for ( int i = 1; i <= n; i ++ )
			for ( int j = 1; j <= m; j ++ )
				if ( ! used [ i ] [ j ] && i + j <= a [ p ] )
				{
					
					if ( i + m - j > ans1 )
						ans1 = i + m - j, ans2 = i + j, xx = i, yy = j;
					else if ( i + m - j == ans1 && i + j > ans2 )
						ans1 = i + m - j, ans2 = i + j, xx = i, yy = j;
						
				}
					
		if ( ans2 == -1 ) {/*printf ( "[a] %d failed\n", p ); */printf ( "rp++");return 0;}
		/*printf ( "[a] %d : %d, %d\n", p, xx, yy );*/
		used [ xx ] [ yy ] = 1;
        
    }
    
	for ( int p = 1; p <= l; p ++ )
	{
		
		int xx, yy, ans2 = -kidding_you;
		
		for ( int i = 1; i <= n; i ++ )
			for ( int j = 1; j <= m; j ++ )
				if ( ! used [ i ] [ j ] && i + m + 1 - j <= b [ p ] )
				{
					if ( i + m - j + 1 > ans2 )
						ans2 = i + m + 1 - j, xx = i, yy = j;
						
				}
					
		if ( ans2 == -1 ) {/*printf ( "[b] %d failed\n", p ); */return 0;}
		/*printf ( "[b] %d : %d, %d\n", p, xx, yy );*/
		used [ xx ] [ yy ] = 1;
        
    }
    
    return 1;
    
}

CF3B Lorry

题目大意

有一个体积为 v 的背包,一共有 n 个物品,每个物品的体积为 ti,价值为 pi 。现要从中取若干物品放入背包,使背包中物品的价值和最大。

思路

贪心。

假设所有的物品都是同一类的,那么显然应该选价值更大的更优,所以对于每一列我们将物品按价值从大到小排序。

枚举体积为 \(1\) 的物品选几个,剩下空间全部放体积为 \(2\) 的物品,取价值的最大值即可。

代码

// Problem: CF3B Lorry
// URL: https://www.luogu.com.cn/problem/CF3B
// Memory Limit: 62.50MB
// Time Limit: 2000 ms
// Author: arlenWKX

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

const int N = 1e5 + 5;

int n, v, cnt1, cnt2, pos1, pos2, ans, sum, pre [ N ];

struct wtf
{
	int p, id;
		
	bool operator < ( const wtf & b ) const
	{ return p > b.p; }
	
} t1 [ N ], t2 [ N ];

int main ( )
{
	
	scanf ( "%d%d", & n, & v );
	
	for ( int i = 1; i <= n; i ++ )
	{
		
		int t, p;
		
		scanf ( "%d%d", & t, & p );
		
		if ( t == 1 ) t1 [ ++ cnt1 ] = { p, i };
		else t2 [ ++ cnt2 ] = { p, i };
		
	}
	
	sort ( t1 + 1, t1 + cnt1 + 1 );
	sort ( t2 + 1, t2 + cnt2 + 1 );
	
	for ( int i = 1; i <= cnt2; i ++ ) pre [ i ] = pre [ i - 1 ] + t2 [ i ].p;
	
    for (int i = 0; i <= min ( v, cnt1 ); i ++ ) {
        sum += t1[i].p;
        if ( sum + pre[min(cnt2, (v - i) / 2)] > ans )
        {
            ans = sum + pre[min(cnt2, (v - i) / 2)];
            pos1 = i, pos2 = min(cnt2, (v - i) / 2);
        }
    }
    
    printf ( "%d\n", ans );
    
    for ( int i = 1; i <= pos1; i ++ ) printf ( "%d\n", t1 [ i ].id );
    for ( int i = 1; i <= pos2; i ++ ) printf ( "%d\n", t2 [ i ].id );
    
    return 0;
    
}

以下内容与题目无关

安利一个超好用的编辑器 —— CP Editor

两道题目

(咦?这是Win11?)

大家熟知的那些 IDE 往往都是为工程开发而设计的,所以在算法竞赛中用起来多少会有些不顺手的地方,想要却没有的 feature。在这些 IDE 中,Dev C++ 是不怎么配置就比较适合 OI 的,而 VS Code 在经过繁杂的配置后可以更加好用。但是,有没有一款 IDE,既不需要繁杂的配置,又能在 OI 这个领域中,在某些方面上,甚至胜过 VS Code 呢?
CP Editor
CP Editor 是一款专门为算法竞赛设计的 IDE,有一键编译并在测试数据上运行,从 OJ 获取样例,在 IDE 内提交至 CF,代码模板等功能。它是一款刚诞生不久的*软件,以后还会变得越来越好。这款 IDE 是跨平台的,支持 Windows, Linux, MacOS。
GitHub Repo

如何使用?

点击下载安装即可

<iframe sandbox="allow-scripts allow-same-origin" src="https://carbon.vercel.app/embed?bg=rgba%28171%2C+184%2C+195%2C+1%29&t=monokai&wt=none&l=auto&ds=true&dsyoff=20px&dsblur=68px&wc=true&wa=true&pv=56px&ph=56px&ln=true&fl=1&fm=Hack&fs=14px&lh=133%25&si=false&es=2x&wm=false&code=%2523%2520include%2520%253Cbits%252Fstdc%252B%252B.h%253E%250A%250Ausing%2520namespace%2520std%253B%250A%250A%250Aint%2520main%2520%28%2520%29%250A%257B%250A%2520%250A%2520%2520cout%2520%253C%253C%2520%2522Hello%2520World%21%2522%2520%253C%253C%2520endl%253B%250A%2520%2520%250A%2520%2520return%25200%253B%250A%2520%2520%250A%257D" style="width: 477px; height: 429px; border: 0; transform: scale(1); overflow: hidden"> </iframe>
上一篇:重置Visual Studio 的配置


下一篇:html 表格