B、关鸡
只要将所有火的位置记录下来,然后单独判断火在(2,0)这个特殊位置的情况,答案只有0 1 2 3
AC代码奉上
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <vector>
#include <map>
#include <list>
#include <deque>
#include <set>
#include <utility>
using namespace std;
#define endl '\n'
#define all(x) x.begin(),x.end()
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> PII;
const ll N = 1e5 + 5 ;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
ll n ;
map<PII , ll> mp ;
ll find(PII a , ll sum){
PII b ;
if(a.fi == 1){
//如果同一列有两个火
b.fi = 2 , b.se = a.se ;
if(mp[b])
sum = 0 ;
//如果前一列在当前的下面一行有
b.se = a.se - 1 ;
if(mp[b])
sum = 0 ;
//如果前一列在当前的下面一行有
b.se = a.se + 1 ;
if(mp[b])
sum = 0 ;
sum = min(sum , 1) ;
}
else{
//如果同一列有两个火
b.fi = 1 , b.se = a.se ;
if(mp[b])
sum = 0 ;
//如果前一列在当前的下面一行有
b.se = a.se - 1 ;
if(mp[b])
sum = 0 ;
//如果前一列在当前的下面一行有
b.se = a.se + 1 ;
if(mp[b])
sum = 0 ;
sum = min(sum , 1) ;
}
return sum ;
}
void solve() {
cin >> n ;
ll sum = 2 , ans = 2 ;
for(ll i = 1 ; i <= n ; ++i){
ll x, y;
cin >> x >> y ;
PII a ;
a.fi = x ;
a.se = y ;
mp[a]++ ;
if(y > 0)
sum = find(a,sum);
else if(y < 0)
ans = find(a,ans) ;
}
PII a ;
ll total = 3;
//如果2 0 有火
a.fi = 2,a.se = 0;
if(mp[a] == 1)
total--;
//如果1 1 或 1 -1 有火 或者左右不需要加火
a.fi = 1,a.se = 1;
if (mp[a] == 1 || sum == 0)
total--;
a.fi = 1,a.se = -1;
if (mp[a] == 1 || ans == 0)
total--;
//输出最小
cout << min(total , sum + ans) << endl ;
mp.clear() ;
}
signed main() {
cin.tie(nullptr)->sync_with_stdio(false);
cout << fixed << setprecision(15);
int _ ;
cin >> _;
while (_--) {
solve();
}
return 0;
}
C、按闹分配
只要注意 Smin = 所有人的办事时间+等待时间 和 Sc - Smin = tc * 鸡后面的人数 即可
AC代码奉上
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <vector>
#include <map>
#include <list>
#include <deque>
#include <set>
#include <utility>
using namespace std;
#define endl '\n'
#define all(x) x.begin(),x.end()
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> PII;
const ll N = 1e5 + 5 ;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
ll n , q , t ;
void solve() {
cin >> n >> q >> t ;
vector<ll> a(n + 1) ;
for(ll i = 1 ; i <= n ; ++i){
cin >> a[i] ;
}
sort(all(a)) ;
for(ll i = 1 ; i <= n ; ++i){
a[i] += a[i - 1] ;
}
while(q--){
ll m ;
cin >> m ;
// 这个写***超时
// for(ll i = 0 ; i <= n ; ++i){
// if(t * (n - i) <= m){
// cout << a[i] + t << endl ;
// break;
// }
// }
// t * (n - i) <= m | n - i <= m / t | i >= n - m / t
// 当m过大时会导致 n - m / t 小于0
cout << a[max(n - m / t , 0)] + t << endl ;
}
}
signed main() {
cin.tie(nullptr)->sync_with_stdio(false);
cout << fixed << setprecision(15);
int _ = 1 ;
//cin >> _;
while (_--) {
solve();
}
return 0;
}
E、本题又主要考察了贪心
这道题目的名字给人一种要用贪心算法的感觉,但题目给的m很小,所以我们可以使用dfs来写。
思路: 只要把每种可能都去试一下,求排名的最小值即可
AC代码奉上
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <vector>
#include <map>
#include <list>
#include <deque>
#include <set>
#include <utility>
using namespace std;
#define endl '\n'
#define all(x) x.begin(),x.end()
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> PII;
const ll N = 15 ;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1);
inline ll max(ll a, ll b) { return a > b ? a : b; }
ll n , m , a[N] , ret;
//定义结构体来存m场比赛双方
struct ikun{
ll sing , dance ;
}b[N];
void dfs(ll u){
//如果当前u==m 就说明我们已经将一种可能试出来了
if(u == m){
ll ans = 1 ;
for(ll i = 2 ; i <= n ; ++i){
if(a[i] > a[1])
ans++ ;
}
//求每种可能的最小名次
ret = min(ans , ret) ;
return ;
}
ll x = b[u + 1].sing , y = b[u + 1].dance ;
//根据题目要求1号的名次尽可能好 所以如果比赛双方有1 那么就让1 胜利
if(x == 1 || y == 1){
a[1] += 3 ;
dfs(u + 1) ;
a[1] -= 3 ;
}
else{
//题目给定的三种情况 都去试
a[y] += 3 ;
dfs(u + 1) ;
a[y] -= 3 ;
a[x] += 3 ;
dfs(u + 1) ;
a[x] -= 3 ;
a[x] += 1 ;
a[y] += 1 ;
dfs(u + 1) ;
a[x] -= 1 ;
a[y] -= 1 ;
}
}
void solve() {
cin >> n >> m ;
//因为题目有多个测试 要给ret(最终排名)给定初值
ret = INF ;
for(ll i = 1 ; i <= n ; ++i){
cin >> a[i] ;
}
for(ll i = 1 ; i <= m ; ++i){
cin >> b[i].sing >> b[i].dance ;
}
dfs(0);
cout << ret << endl ;
}
signed main() {
cin.tie(nullptr)->sync_with_stdio(false);
cout << fixed << setprecision(15);
int _ ;
cin >> _;
while (_--) {
solve();
}
return 0;
}
I、It's bertrand paradox. Again!
打表找规律
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <vector>
#include <map>
#include <list>
#include <deque>
#include <set>
#include <utility>
#include <ctime>
using namespace std;
#define endl '\n'
#define all(x) x.begin(),x.end()
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> PII;
const ll N = 1e5 + 5 ;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
void solve() {
ll n ;
ll sum = 0 ;
cin >> n ;
for(ll i = 1 ; i <= n ; ++i){
ll x , y , z ;
cin >> x >> y >> z ;
sum += abs(x) + abs(y) ;
}
if(sum > 76e5)
cout << "bit-noob" << endl ;
else
cout << "buaa-noob" << endl ;
}
signed main() {
cin.tie(nullptr)->sync_with_stdio(false);
cout << fixed << setprecision(15);
int _ = 1;
//cin >> _;
while (_--) {
solve();
}
return 0;
}
L、要有光
画图即可
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <vector>
#include <map>
#include <list>
#include <deque>
#include <set>
#include <utility>
using namespace std;
#define endl '\n'
#define all(x) x.begin(),x.end()
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> PII;
const ll N = 1e5 + 5 ;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
void solve() {
ll c , d , h , w ;
cin >> c >> d >> h >> w ;
//光与墙面形成的阴影 梯形面积
cout << 3 * c * w << endl ;
}
signed main() {
cin.tie(nullptr)->sync_with_stdio(false);
cout << fixed << setprecision(15);
int _ = 1;
cin >> _;
while (_--) {
solve();
}
return 0;
}