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;
}