• Wannafly挑战赛29-A/B


    链接:https://ac.nowcoder.com/acm/contest/271/A
    来源:牛客网

    御坂美琴
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 131072K,其他语言262144K
    64bit IO Format: %lld

    题目描述

    misaka是呱太爷爷的小粉丝,呱太爷爷有一句话说的好:"一尺之棰,日取其半,万世不竭"。

    misaka现在有 n 个呱太玩偶放在一堆,每一次操作,misaka会选择当前个数 > 1 的一堆呱太玩偶。并将这一堆呱太玩偶分成 两堆,x 是当前这一堆玩偶的个数。现在 misaka 想将玩偶分成 m 堆,其中第 i 堆呱太玩偶的个数是 ai ,你需要告诉 misaka 是否能通过若干次操作将玩偶分成指定的这 m 堆。如果可以输出 ,否则输出

    输入描述:

    第一行两个数 n, m 。
    接下来一行 m 个数 a
    i

    输出描述:

    输出共一个字符串 
    ,表示 misaka 能否将玩偶分成指定的 m 堆。
        简单模拟一下就好了,我的做法是先将输入的ai按降序排列,然后不断地由大到小分解石头,中间遇到等于ai的石头数就把这堆给它。
    一开始以为queue就好了,WA很多次,后来发现要用priority_queue,比如25,25-> 25,13,12 -> 13,12,13,12 这样就不是严格递减了,
    换成堆AC。
      
     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 #include<queue>
     5 # include <algorithm>
     6 using namespace std;
     7 typedef long long LL;
     8 using namespace std;
     9 LL a[100010];
    10 priority_queue<LL>q;
    11 int main(){
    12     LL n,m;
    13     cin>>n>>m;
    14     LL s=0;
    15     for(int i=1;i<=m;++i)scanf("%lld",a+i),s+=a[i];
    16     if(s!=n){
    17         puts("ham");
    18         return 0;
    19     }
    20     q.push(n);
    21     bool ok;
    22     sort(a+1,a+1+m,greater<LL>());
    23     int i=1;
    24     while(i<=m && !q.empty() ){
    25         LL p=q.top();
    26         q.pop();
    27         if(p>a[i]){
    28             q.push(p-p/2);
    29             q.push(p/2);
    30         }
    31         else if(p==a[i]){
    32             n-=a[i];
    33             i++;
    34             continue;
    35         }
    36         else{
    37             break;
    38         }
    39     
    40     }
    41     if(n==0 && i==m+1) puts("misaka");
    42     else puts("ham");
    43     return 0;
    44 } 

    链接:https://ac.nowcoder.com/acm/contest/271/B
    来源:牛客网

    白井黑子
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 524288K,其他语言1048576K
    64bit IO Format: %lld

    题目描述

    kuroko 作为常盘台唯一的空间系能力者,在每年例行的能力测试中可绝对不能让 misaka 失望哦,但是由于她的等级只是 level 4「大能力者」,在能力测试中会遇到不少困难。kuroko 是一个凡事都会尽力的好女孩,所以请你帮她算出她最多能完成多少测试吧

    对于空间系能力者测试的内容是检验对物体进行空间移动的能力,测验时一共有 n 个物品放在一条直线上,每个物品都有一个坐标 ai ,kuroko 可以选择两个物品并使用能力交换它们的位置,但是如果两个物品的坐标不满足 kuroko 的计算公式的话,她就没有办法使用能力。

    具体来说,对于坐标 ai ,其在 kuroko 的计算公式中是用参数 f(ai) 表示的。f(ai) 是 ai 各数位相乘的结果,由于 level 4「大能力者」在学园都市中也是很强大的存在,所以满足公式的条件不会太苛刻,对于两个物品 ai, aj ,如果 f(ai) x f(aj) 不能被某个自然数的 k 次幂表示 的话,那么 kuroko 就能对这两个物品使用能力。

    现在 kuroko 想知道,有多少对物品她可以对其施展能力,知道了这个后她就知道自己能完成多少测验了。

    这里认为任何自然数的 0 次幂都是1;
     
     
     
     
       一开始直接理解错题意,以为是k^x,想着直接暴力扫就好了,后来发现是x^k = =
     注意到把a数组转化为f之后,f里每个数的因子都只有2,3,5,7这四个,每个数都可以写作  A=2^v1 * 3^v3 * 5^v5 * 7^v7 的格式。
    我们把每个数的<a1,a3,a5,a7>处理出来,要想A1*A1'是k次幂数显然要满足(vi+vi')%k==0,然后每次找他的补集统计一下不合法的数量就好了。
    A<=1e18所以 a1,a3,a5,a7<=60,注意特判一下
    k=0的情况。
    
    
    段错误半天,后来发现找补集的时候可能对应的系数超出60,也就说明不存在这种方案,直接特判下就过了。
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 #include<map>
     6 #include<algorithm>
     7 using namespace std;
     8 typedef long long LL;
     9 using namespace std;
    10 LL a[100010];
    11 int v[4]={2,3,5,7};
    12 int g[100][100][100][100];
    13 int b[100010][4];
    14 LL f(LL n){
    15     if(!n) return 0;
    16     LL s=1;
    17     while(n){
    18         s*=(n%10);
    19         n/=10;
    20     }
    21     return s;
    22 }
    23 int main(){
    24     LL s=0,n,k,zero=0;
    25     scanf("%lld%lld",&n,&k);
    26     for(int i=1;i<=n;++i) scanf("%lld",a+i),a[i]=f(a[i]);    
    27     if(k==1){
    28         puts("0");
    29         return 0;
    30     }
    31     if(k==0){
    32         for(int i=1;i<=n;++i)if(a[i]==1)s++;
    33         printf("%lld
    ",n*(n-1)/2-s*(s-1)/2);
    34         return 0;
    35     }
    36     for(int i=1;i<=n;++i){
    37         if(a[i]==0){zero++;continue;}
    38         LL tmp=a[i];
    39         for(int j=0;j<4;++j){
    40             while(tmp&&tmp%v[j]==0){
    41                 b[i][j]++;
    42                 tmp/=v[j];
    43             }
    44             b[i][j]%=k;
    45             if(b[i][j]>60){
    46                 while(1)puts("fuck");
    47             }
    48         }
    49         g[b[i][0]][b[i][1]][b[i][2]][b[i][3]]++;
    50     }
    51     LL ans=0;
    52     for(int i=1;i<=n;++i){
    53         if(a[i]==0){
    54             ans+=n-i;
    55             zero--;
    56             continue;
    57         }
    58         int u[4];
    59         g[b[i][0]][b[i][1]][b[i][2]][b[i][3]]--;
    60         for(int j=0;j<4;++j){
    61             if(b[i][j]==0) u[j]=0;
    62             else u[j]=(k-b[i][j])%k;
    63             if(u[j]>60)u[j]=61;
    64         }
    65         ans+=g[u[0]][u[1]][u[2]][u[3]]+zero;
    66     }
    67     ans=n*(n-1)/2-ans;
    68     printf("%lld
    ",ans);
    69     return 0;
    70 } 
     
     
  • 相关阅读:
    linux源码解读(五):文件系统——文件和目录的操作
    linux源码解读(二):文件系统——高速缓存区
    linux源码解读(一):进程的创建、调度和销毁
    linux源码解读(四):文件系统——挂载和卸载
    .net工作室第六周、类。人打怪兽
    无法将类型为“System.Web.UI.LiteralControl”的对象强制转换为类型
    sql查询语句
    .net工作室第七周 数据库
    时间函数的使用。
    GridView 删除数据
  • 原文地址:https://www.cnblogs.com/zzqc/p/10032233.html
Copyright © 2020-2023  润新知