P4447 [AHOI2018初中组]分组
要求分成的每个小组的队员实力值连续,同时,一个队不需要两个实力相同的选手
满足所有人都恰好分到一个小组,使得人数最少的组人数最多,输出人数最少的组人数的最大值。
注意:实力值可能是负数,分组的数量没有限制。
关键就是当遇到重复的部分时该怎么分组
能分组的放在一组,下个数能进多个组时,进长度最短的组,保证长度最短的组长度最长!
#include <bits/stdc++.h>
using namespace std;
int n, a[100005];
int m, lst[100005], len[100005];
//分 m(从1开始) 组,第 i 组 (最后一个数为 lst[i], 长度为 len[i])
int main()
{
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);//小到大排序
for(int i = 0; i < n; i++){ //一个一个元素进
bool flag = 0; //没找到
int l = 100005, id;//id:最终进的组号
for(int j = 1; j <= m; j++){ //遍历每组
if(lst[j] + 1 == a[i] && len[j] < l){
flag = 1, l = len[j], id = j;
}
}
if(! flag){ //如果没找到,再开一组
m++, lst[m] = a[i], len[m] = 1;
}else{
lst[id] = a[i], len[id]++;
}
}
sort(len + 1, len + m + 1);
cout << len[1] << endl;
return 0;
}
P1080 [NOIP2012 提高组] 国王游戏
每位大臣获得的金币数分别是:
排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
使得获得奖赏最多的大臣,所获奖赏尽可能的少
国王的位置始终在队伍的最前面 ,输出队伍中获奖赏最多的大臣所获得的金币数
通过按照l1*r1 < l2* r2 <...这样排序,最终得最后一个大臣的金币最多,这种排序保证了最多的最少。
由于相乘的数很大,因此要涉及高精 乘和除
60%
#include <bits/stdc++.h>
using namespace std;
long long n, a, b, sum = 1;
struct node{
int l, r;
}p[10005];
bool cmp(node a, node b){//这样排序可保证"最多金币最少"
return a.l * a.r < b.l * b.r;
}
int main()
{
cin >> n;
for(int i = 0; i <= n; i++) cin >> p[i].l >> p[i].r;
sort(p + 1, p + n + 1, cmp);//国王不参与排序
for(int i = 0; i < n; i++) sum *= p[i].l;
sum /= p[n].r;
if(sum == 0) sum = 1;//0.几向上取整1
cout << sum << endl;
return 0;
}
100% 高精 乘、除、输出
#include <bits/stdc++.h>
using namespace std;
int n, s[1000000] = {1}, a[1000000], slen;
struct node{
int l, r;
}p[10005];
bool cmp(node a, node b){//这样排序可保证"最多金币最少"
return a.l * a.r < b.l * b.r;
}
void mul(int k){
int jw = 0;
for(int i = 0; i <= slen; i++) s[i] *= k;//每一位乘k
for(int i = 0; i <= slen; i++){//处理进位
jw += s[i]; //进位加当前位
s[i] = jw % 10; //进位后
jw /= 10; //进位数
} while(jw){
slen++;
s[slen] = jw % 10;
jw /= 10;
}
}
void div(int k){ //高精/低精,借位取余
int t = 0;
for(int i = slen; i >= 0; i--){//从最高位开始
t = t *10 + s[i];
a[i] = t / k;
t %= k;
}
}
void print(){
int t = slen;
while(a[t] == 0){
t--;
if(t == -1) cout << 1 << endl;
} for(int i = t; i >= 0; i--) cout << a[i];
}
int main()
{
cin >> n;
for(int i = 0; i <= n; i++) cin >> p[i].l >> p[i].r;
sort(p + 1, p + n + 1, cmp);//国王不参与排序
for(int i = 0; i < n; i++) mul(p[i].l);//高精乘
div(p[n].r); //高精除
print();//高精输出
return 0;
}