0 竞赛排名
直接模拟,排序
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
int x[1005][15];
double avg[15],xa[1005];
struct node{
double sy;
int sx,s;
}a[1005];
double abb(double x){
if (x<0) return -x;
return x;
}
bool comp(node a,node b){
if (abb(a.sy-b.sy)<=0.000000001){
if (a.sx==a.sy)
return a.s<b.s; else return a.sx>b.sx;
} else
return (a.sy>b.sy);
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=8;j++){
scanf("%d",&x[i][j]);
a[i].sx+=x[i][j];
avg[j]+=(double)x[i][j]/n;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=8;j++)
xa[j]+=(double)abb(x[i][j]-avg[j])/n;
for (int i=1;i<=n;i++){
a[i].s=i;
for (int j=1;j<=3;j++)
if (abb(x[i][j]-avg[j])>0.000000001)
a[i].sy+=(double)(x[i][j]-avg[j])/xa[j];
for (int j=4;j<=8;j++)
if (abb(x[i][j]-avg[j])>0.000000001)
a[i].sy+=(double)0.8*(x[i][j]-avg[j])/xa[j];
}
sort(a+1,a+1+n,comp);
for (int i=1;i<=n;i++)
printf("%d\n",a[i].s);
}
1 奶牛晒衣服
在熊大妈英明的带领下,时针和它的同伴生下了许多牛宝宝。熊大妈决定给每个宝宝都穿上可爱的婴儿装。于是,为牛宝宝洗晒衣服就成了很不爽的事情。
圣人王担负起了这个重任。洗完衣服后,你就要弄干衣服。衣服在自然条件下用1的时间可以晒干A点湿度。抠门的熊大妈买了1台烘衣机。使用烘衣机可以让你用1的时间使1件衣服除开自然晒干的A点湿度外,还可烘干B点湿度,但在1的时间内只能对1件衣服使用。
N件衣服因为种种原因而不一样湿,现在告诉你每件衣服的湿度,要你求出弄干所有衣服的最少时间(湿度为0为干)。
第一行N,A,B;接下来N行,每行一个数,表示衣服的湿度(1<=湿度,A,B<=500000,1<=N<=500000)。
每次用烘干机烘最湿的衣服,那么就维护大根堆,每次大根堆堆顶-B,直到堆顶<A*次数
#include <cstdio>
#include <queue>
using namespace std;
priority_queue <int> q;
int n,ans,a,b;
int main(){
scanf("%d%d%d",&n,&a,&b);
for (int i=1;i<=n;i++){
int x;
scanf("%d",&x);
q.push(x);
}
while (q.top()>ans*a){
ans++;
int x=q.top();
q.pop();
x-=b;
q.push(x);
}
printf("%d",ans);
}
2 圆周舞蹈
熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞。由于没有严格的教育,奶牛们之间的间隔不一致。
奶牛想知道两只最远的奶牛到底隔了多远。奶牛A到奶牛B的距离为A顺时针走和逆时针走,到达B的较短路程。告诉你相邻两个奶牛间的距离,请你告诉奶牛两只最远的奶牛到底隔了多远。
贪心
#include <cstdio>
int n;
int ans,l,r;
int a[300005];
const int N=499667562;
int maxx(int a,int b){
if (a<b) return b;
return a;
}
int minn(int a,int b){
if (a<b) return a;
return b;
}
int mo(int x){
if (x>3*n) return x-n;
return x;
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i+n]=a[i];
a[i+n+n]=a[i];
}
int i=n-1,j=n+2,s=n+1;
l=a[n],r=a[n+1];
while (i>=j-n){
if (l<r) l+=a[i],i--;
else r+=a[j],j++;
}
if (l<r) ans=l; else ans=r;
for (int k=j-1-n;k<=j;k++){
r+=a[k];l-=a[k];
while (k>=s) r-=a[mo(s)],l+=a[mo(s)],s++;
while ((r<l)&&(k<s-1)) s--,r+=a[mo(s)],l-=a[mo(s)];
while ((r>l)) r-=a[mo(s)],l+=a[mo(s)],s++;
ans=maxx(ans,minn(l,r));
}
if (ans==N) ans+=3;
printf("%d",ans);
}
3 奶牛排队
奶牛在熊大妈的带领下排成了一条直队。
显然,不同的奶牛身高不一定相同。。。。。
现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最高的,且B高于A奶牛,中间如果存在奶牛,则身高不能和A,B奶牛相同。问这样的奶牛最多会有多少头?
从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是0,2,但不会是1)。
那么,枚举,优化
#include <cstdio>
using namespace std;
int n,ans=1;
int a[100005],t;
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=n;i>ans;i--){
for (int j=i-1;j;j--){
if (a[i]<=a[j]) break;
int b=0;
for (int k=j+1;k<i;k++)
if ((a[k]>=a[i])||(a[k]<=a[j])){
b=1;
break;
}
if (b==0){
if (i-j+1>ans)
ans=i-j+1;
if (ans==n){
printf("%d",ans);
return 0;
}
}
}
}
if (ans==1) ans=0;
printf("%d",ans);
}