1. 程式人生 > >洛谷 P1080 國王遊戲

洛谷 P1080 國王遊戲

return orange algo argv 為什麽 整數 sizeof cnblogs urn

題目描述

恰逢 H 國國慶,國王邀請 n 位大臣來玩一個有獎遊戲。首先,他讓每個大臣在左、右手上面分別寫下一個整數,國王自己也在左、右手上各寫一個整數。然後,讓這 n 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若幹金幣,每位大臣獲得的金幣數分別是:排在該大臣前面的所有人的左手上的數的乘積除以他自己右手上的數,然後向下取整得到的結果。

國王不希望某一個大臣獲得特別多的獎賞,所以他想請你幫他重新安排一下隊伍的順序,使得獲得獎賞最多的大臣,所獲獎賞盡可能的少。註意,國王的位置始終在隊伍的最前面。

輸入輸出格式

輸入格式:

第一行包含一個整數 n,表示大臣的人數。

第二行包含兩個整數 a和 b,之間用一個空格隔開,分別表示國王左手和右手上的整數。

接下來 n 行,每行包含兩個整數 a 和 b,之間用一個空格隔開,分別表示每個大臣左手和右手上的整數。

輸出格式:

輸出只有一行,包含一個整數,表示重新排列後的隊伍中獲獎賞最多的大臣所獲得的金幣數。

輸入輸出樣例

輸入樣例#1:
3 
1 1 
2 3 
7 4 
4 6 
輸出樣例#1:
2

說明

【輸入輸出樣例說明】

按 1、2、3 號大臣這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 2;

按 1、3、2 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 2;

按 2、1、3 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 2;

按 2、3、1 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 9;

按 3、1、2 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 2;

按 3、2、1 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 9。

因此,獎賞最多的大臣最少獲得 2 個金幣,答案輸出 2。

【數據範圍】

對於 20%的數據,有 1≤ n≤ 10,0 < a、b < 8;

對於 40%的數據,有 1≤ n≤20,0 < a、b < 8;

對於 60%的數據,有 1≤ n≤100;

對於 60%的數據,保證答案不超過 10^9;

對於 100%的數據,有 1 ≤ n ≤1,000,0 < a、b < 10000。

NOIP 2012 提高組 第一天 第二題

貪心 高精乘低精 高精除低精

為什麽壓位不對。。

屠龍寶刀點擊就送

#include <algorithm>
#include <cstring>
#include <cstdio>
#define N 1500
#define rep(a,b,c) for(int a=b;a<=c;++a)

struct node
{
    int a,b;
    bool operator<(node c)const
    {
        return a*b<c.a*c.b;
    }
}dc[N];
struct Node
{
    int a[N*10];
    Node() {memset(a,0,sizeof(a));}
}cj,ans;
inline Node operator * (Node a,int b)
{
    Node c;
    c.a[0]=a.a[0]+1;
    int x=0;
    for(int i=1;i<=c.a[0];++i) c.a[i]=a.a[i]*b;
    for(int i=1;i<=c.a[0];++i)
    {
        c.a[i]+=x;
        if(c.a[i]>=10) {x=c.a[i]/10;c.a[i]%=10;}
        else x=0;
    }
    for(;x;x/=10) c.a[++c.a[0]]=x%10;
    for(;c.a[0]>1&&c.a[c.a[0]]==0;--c.a[0]);
    return c;
}
inline void output(Node a,int b)
{
    int i=a.a[0]-1,x=a.a[a.a[0]];
    for(;i>0;--i)
    {
        if(x>=b) break;
        x=x*10+a.a[i];
    }
    if(x<b) {puts("1");return;}
    for(;i>0;--i)
    {
        printf("%d",x/b);
        x%=b;
        x=x*10+a.a[i];
    }
    printf("%d\n",x/b);
}
int n,A,B;
inline int max(int a,int b) {return a>b?a:b;}
int main(int argc,char *argv[])
{
    scanf("%d%d%d",&n,&A,&B);
    rep(i,1,n) scanf("%d%d", &dc[i].a,&dc[i].b);
    std::sort(dc+1,dc+1+n);
    int k=A;
    for(;k;k/=10) cj.a[++cj.a[0]]=k%10;
    for(int j=1;j<n;++j) cj=cj*dc[j].a;
    output(cj,dc[n].b);
    return 0;
}

洛谷 P1080 國王遊戲