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