P1080 國王遊戲 貪心
題目描述
恰逢 HH國國慶,國王邀請nn 位大臣來玩一個有獎遊戲。首先,他讓每個大臣在左、右手上面分別寫下一個整數,國王自己也在左、右手上各寫一個整數。然後,讓這 nn 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若幹金幣,每位大臣獲得的金幣數分別是:排在該大臣前面的所有人的左手上的數的乘積除以他自己右手上的數,然後向下取整得到的結果。
國王不希望某一個大臣獲得特別多的獎賞,所以他想請你幫他重新安排一下隊伍的順序,使得獲得獎賞最多的大臣,所獲獎賞盡可能的少。註意,國王的位置始終在隊伍的最前面。
輸入輸出格式
輸入格式:
第一行包含一個整數nn,表示大臣的人數。
第二行包含兩個整數 aa和 bb,之間用一個空格隔開,分別表示國王左手和右手上的整數。
接下來 nn行,每行包含兩個整數aa 和 bb,之間用一個空格隔開,分別表示每個大臣左手和右手上的整數。
輸出格式:
一個整數,表示重新排列後的隊伍中獲獎賞最多的大臣所獲得的金幣數。
輸入輸出樣例
輸入樣例#1: 復制3 1 1 2 3 7 4 4 6輸出樣例#1: 復制
2
說明
【輸入輸出樣例說明】
按11、22、33 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 22;
按 11、33、22 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為22;
按 22、11、33 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 22;
按22、33、11這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為99;
按 33、11、22這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 22;
按33、22、11 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 99。
因此,獎賞最多的大臣最少獲得 22個金幣,答案輸出 22。
【數據範圍】
對於 20%的數據,有 1≤ n≤ 10,0 < a,b < 81≤n≤10,0<a,b<8;
對於 40%的數據,有1≤ n≤20,0 < a,b < 81≤n≤20,0<a,b<8;
對於 60%的數據,有 1≤ n≤1001≤n≤100;
對於 60%的數據,保證答案不超過 10^9109;
對於 100%的數據,有 1 ≤ n ≤1,000,0 < a,b < 100001≤n≤1,000,0<a,b<10000。
NOIP 2012 提高組 第一天 第二題
雖然沒有找到規律 但是按照左手排序過了五個點 按照右手排序能過1個點。。合計6個
#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define inf 0x3f3f3f3f #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 1000+5 struct node { int l,r; }s[N]; bool cmp(node a,node b) { return a.l<b.l||a.l==b.l&&a.r<b.r; } bool cmp2(node a,node b) { return a.r<b.r||a.r==b.r&&a.l<b.l; } int main() { int n; int L,R; RIII(n,L,R); rep(i,1,n) RII(s[i].l,s[i].r); sort(s+1,s+1+n,cmp); ll maxx=-99000999999; ll sum=L; rep(i,1,n) { maxx=max(maxx,sum/s[i].r); sum*=s[i].l; } sort(s+1,s+1+n,cmp2); ll maxx2=-99000999999; sum=L; rep(i,1,n) { maxx2=max(maxx2,sum/s[i].r); sum*=s[i].l; } cout<<min(maxx2,maxx); return 0; }View Code
P1080 國王遊戲 貪心