2024ICPC(II)补题

A.Gambling on Choosing Regionals

要想得到好的排名,则只需要关注规模最小的比赛。最坏的情况是所有强的队伍都来参加这场比

①结构体的写法

②sort重载排序

③map会存

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

#define int long long // 定义 int 为 long long,方便处理大整数
const int N = 1e5 + 10; // 定义常量 N,表示最大队伍数量
int n, k; // n 表示队伍数量,k 表示地区比赛的数量

// 定义结构体 node,用于存储每支队伍的信息
struct node {
    int w; // 综合实力
    int id; // 队伍编号
    int rank; // 最终排名
    string name; // 所属大学的缩写
} a[N];

// 自定义比较函数,用于按综合实力降序排序
bool cmp(node a, node b) {
    return a.w > b.w; // 返回综合实力较强的队伍排在前面
}

// 自定义比较函数,用于按队伍编号升序排序
bool cmp2(node a, node b) {
    return a.id < b.id; // 返回编号较小的队伍排在前面
}

signed main() {
    // 输入队伍数量 n 和地区比赛数量 k
    cin >> n >> k;
    int minn = 0x3f3f3f; // 设置一个很大的初始值,用于存储每个大学可参赛队伍的最小数量

    // 输入每次地区比赛的最大参赛队伍数量 c_i
    for (int i = 1; i <= k; i++) {
        int c; 
        cin >> c; // 输入每个地区比赛的参赛限制
        minn = min(minn, c); // 更新最小参赛数量
    }

    // 输入每支队伍的综合实力和所属大学的缩写
    for (int i = 1; i <= n; i++) {
        cin >> a[i].w >> a[i].name; // 输入实力和大学名
        a[i].id = i; // 设置队伍编号
    }

    // 按综合实力降序排序
    sort(a + 1, a + 1 + n, cmp);
    int cnt = 0; // 用于统计当前可以获得名次的队伍数量
    map<string, int> mp; // 存储每个大学参赛队伍的数量

    // 计算每支队伍的排名
    for (int i = 1; i <= n; i++) {
        // 如果该大学已经有的队伍数量达到限制,当前队伍的排名为 cnt - 1
        if (mp[a[i].name] >= minn) 
            a[i].rank = cnt - 1; 
        else 
            a[i].rank = cnt; // 否则当前队伍的排名为 cnt

        mp[a[i].name]++; // 增加该大学参赛队伍数量

        // 如果该大学的队伍数量未达到限制,则增加 cnt
        if (mp[a[i].name] <= minn) 
            cnt++; 
    }

    // 按队伍编号升序排序,以便输出结果
    sort(a + 1, a + 1 + n, cmp2);

    // 输出每支队伍的最终排名,排名从 1 开始
    for (int i = 1; i <= n; i++) {
        cout << a[i].rank + 1 << endl; // 输出排名
    }

    return 0; // 返回 0,表示程序结束
}

I.Strange Binary

首先,4的倍数不可,因为此时a0和a1必须=0;

其次,

奇数情况:把所有位全填1,再看n的2进制中,如果第i位为一,则i-1位变为1不变若为0,变为 - 1.

偶数情况:a[0] = 0;即可,因为就查了个1

#include <bits/stdc++.h>
using namespace  std;
#define int long long 
const int N = 1e5 + 10;
int n,t;
int a[32];
signed main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		for(int i = 0;i <= 31;i++) a[i] = 1;
		if(n % 4 == 0) cout<<"NO"<<endl;
		else 
		{
			cout <<"YES"<<endl;
			int k = 0,m = n;
			while(k < 32)
			{
				if(n & 1) a[ k-1] = 1;//i位控制的是 i- 1位
				else a[k-1] = -1;
				n >>= 1;k++;
			}
			if(m % 2 == 0) a[0] = 0;
			for(int i = 0;i < 32;i++)
			{
				cout<<a[i]<<" ";
				if((i + 1) % 8 == 0) cout<<endl;
			}
		}
	} 
	return 0;
}

J。Stacking of Goods

把w*下一个的c第减排序;使得减去的w*c总和是最大的

①结构体写

②重载不单纯的排序

③要用long long的用double也会tle

#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int N = 1e5 +10;
int n;
struct Good{
	int w, v, c, s;
	bool operator<(const Good&a) const{
       return w * a.c > c * a.w;//按w*c排序,与v没有关系,因为最后用和都求出来了
    }
}good[N];

signed main()
{
	ios::sync_with_stdio(0);
    cin.tie(0);
	cin >> n;
	for(int i = 1; i <= n; i ++){
		cin>>good[i].w>>good[i].v>>good[i].c;
		
	}
	sort(good + 1, good + 1 + n);
	
	for(int i = 1; i<= n; i ++){
		good[i].s = good[i - 1].s + good[i - 1].w;
	}
	
	int sum = 0;
	for(int i = 1; i <= n; i ++){
		sum += good[i].v - good[i].s * good[i].c;
	}
	cout << sum;
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值