zoukankan      html  css  js  c++  java
  • 国王的游戏

    题目链接:https://ac.nowcoder.com/login?callBack=%2Facm%2Fproblem%2F16561%3F%26headNav%3Dacm

    题目意思: 国王要赏赐大臣,国王和每个大成左右手都有一个数字,然后他们排成一队,国王始终站在在前面,每个大臣得到的赏赐都是排在他前面的人(除他自己)的左手数字的累乘除以他本人右手上的数字。

    题目思路:可以发现交换中间任意两个大臣的位置,都不会影响前面的大臣的赏赐,也不会影响后面的大臣的赏赐。所以我们假设A大臣在前面B大臣在后面优于他们的交换。那么通过列出计算式可以发现,A的左右手乘积小于B的左右手乘积。

    具体看:https://ac.nowcoder.com/acm/problem/blogs/16561

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int now[20010],sum[20010],ans[20010],add[20010];
     4 struct Node {
     5     int a;
     6     int b;
     7     long long a_b;
     8 }node[1010];
     9 bool cmp (Node x,Node y){
    10     return x.a_b < y.a_b;
    11 }
    12 int read() {
    13     int ans=0,flag=1;
    14     char ch=getchar();
    15     while( (ch>'9' || ch<'0') && ch!='-' ) ch=getchar();
    16     if(ch=='-') flag=-1,ch=getchar();
    17     while(ch>='0' && ch<='9') ans=ans*10+ch-'0',ch=getchar();
    18     return ans*flag;
    19 }
    20 void times(int x){//½«x³ËÈëansÊý×飬addΪÖмäÊý×飬ģÄâ½øλ²ð·Ö
    21     memset(add,0,sizeof(add));
    22     for(int i = 1;i <= ans[0];i ++){
    23         ans[i] *= x;
    24         add[i + 1] = ans[i]/10;
    25         ans[i] %= 10;
    26     }
    27     for(int i = 1;i <= ans[0] + 4;i ++){//½«½á¹û½øλ
    28         ans[i] += add[i];
    29         if(ans[i] >= 10){
    30             ans[i + 1] += ans[i]/10;
    31             ans[i] %= 10;
    32         }
    33         if(ans[i] != 0){
    34             ans[0] = max(ans[0],i);//ʵʱ¸üнá¹ûµÄ³¤¶È
    35         }
    36     }
    37 }
    38 void devide(int x){//½«ans³ýÒÔxµÄ½á¹û±£´æÔÚaddÖÐ
    39     memset(add,0,sizeof(add));
    40     int q = 0;
    41     for(int i = ans[0];i >= 1;i --){
    42         q *= 10;
    43         q += ans[i];
    44         add[i] = q/x;
    45         if(add[0] == 0 && add[i] != 0){
    46             add[0] = i;
    47         }
    48         q %= x;
    49     }
    50 }
    51 bool compare(){
    52     if(add[0] == sum[0]){
    53         for(int i = add[0];i >= 1;i --){
    54             if(add[i] > sum[i]){
    55                 return 1;
    56             }
    57             if(add[i] < sum[i]){
    58                 return 0;
    59             }
    60         }
    61     }
    62     if(add[0] > sum[0]) return 1;
    63     if(add[0] < sum[0]) return 0;
    64 }
    65 void cp(){
    66     memset(sum,0,sizeof(sum));
    67     for(int i = 0;i <= add[0];i ++){
    68         sum[i] = add[i];
    69     }
    70 }
    71 int main() {
    72     int n,a,b;
    73     n = read();
    74     for(int i = 0;i <= n;i ++){
    75         node[i].a = read();node[i].b = read();
    76         node[i].a_b = node[i].a * node[i].b;
    77     }
    78     sort(node + 1,node + n + 1,cmp);
    79     ans[0] = 1;ans[1] = 1;
    80     for(int i = 1;i <= n;i ++){
    81         times(node[i - 1].a);//ÀÛ³Ë×óÊÖÊý×Ö£¬´«ÈëÒ»¸ö³ËÒ»¸ö
    82         devide(node[i].b);//³ýÒÔÓÒÊÖµÄÊý×Ö
    83         if(compare()){//Èç¹û³ýÒÔÓÒÊÖµÄÊý×ֵĽá¹û(add)±Èsum£¨¾ÍÊÇ×îÖմ𰸣©Ð¡£¬¸üÐÂsum
    84             cp();//¸´ÖƵ½sum
    85         }
    86     }
    87     for(int i = sum[0];i >= 1;i --){
    88         cout<<sum[i];
    89     }
    90     return 0;
    91 } 
  • 相关阅读:
    Path类
    C#集合
    阿里巴巴2013年实习生笔试题B
    阿里巴巴2013年实习生笔试题A
    腾讯2014年校园招聘笔试试题
    腾讯技术类校园招聘笔试试题
    腾讯2013年实习生笔试题
    腾讯2012年实习生笔试题
    hdu1505
    hdu1506
  • 原文地址:https://www.cnblogs.com/Mingusu/p/13034658.html
Copyright © 2011-2022 走看看