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