Test on 11/10/2016

@kaike

1.进制

  (spehex.pas/c/cpp)

【问题描述】

现在给定一个特殊的计数方式,混合进制数。也就是给定一个多位数,每位数上的进制都是不一样的。

比如给定一个三位数:这三位数的进制分别是2 3 2.也就是最小的位数逢2进1,次小位数逢3进制,最高位逢2进1.

那么,这个混合进制数最小数是0,最大数是121。一共有2*3*2=12个数。

分别是:000,001,010,011,020,021,100,101,110,111,120,121。

如果我想知道第7大的数,就是100.

现在的问题就是,给你每个位数上的进制,你找出从0开始,第k个数是多少?

【输入】

第一行 一个整数n,表示这个数有n位 n<=30

第二行,n个用空格隔开的整数,依次为最高位到最低位的进制。 保证进制都在十进制以内。

保证这个混合进制数的最大数的编号在int范围内。

第三行为m,表示m次查询。m<=6

接下来m行,每行一个整数k,表示要查询的混合进制数的第k小的数

保证k在int范围内。

 

【输出】

       m行。每行一个数,表示要查询的混合进制数的第k小的数在这个混合进制数里的值是多少。

如果超过要求的位数,那么输出-1

【输入输出样例1】

spehex.in

spehex.out

3

2 3 2

3

7

9

14

100

110

-1

 

抓狂了两小时,最后A了?

数据太弱了。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n,b[20],m,k,s[20];
 5 long long sum=1;
 6 int main()
 7 {
 8     freopen("spehex.in","r",stdin);
 9     freopen("spehex.out","w",stdout);
10     cin>>n;
11     for(int i=n;i>0;i--)
12     {    cin>>b[i];
13         sum*=b[i];
14     }
15     cin>>m;
16     for(int i=1;i<=m;i++)
17     {
18         string s1;
19         int j=1;
20         cin>>k;
21         if(k==1)    cout<<0<<endl;
22         else if(k>sum)  cout<<-1<<endl;
23         else{
24             k--;
25             while(k)
26             {
27                 s[j]=k%b[j];
28                 k/=b[j];
29                 j++;
30             }
31             for(int c=j-1;c>0;c--)
32                 cout<<s[c];
33             cout<<endl;
34         }
35     }
36     return 0;
37 }
= =

1.旅行

  (fule.pas/c/cpp)

【问题描述】

    小x要去旅游了。他决定开一辆耗油量很高的巨大的拉风的tank去旅游了。

    这辆tank有一个巨大的油箱,可以装满G升燃油。tank是很费油的,每升燃油只够tank跑一公里,而小x的旅程要有D公里要跑。

    虽然油箱很大,但是,显然旅途中是需要加油的。

    小x得到了旅途中加油站的信息,一共有N个加油站,第i个加油站距离起点的距离为X_i(0 <= X_i <= D),每公升燃油价格为Y_i元(1 <= Y_i <= 1,000,000)。

    现在小x想知道,如果出发时,tank里已经有B公升燃油(0 <= B <= D),那么,他最少花费多少钱,可以完成整个旅途。

    如果中间因为燃油不够而无法完成旅程,那么你需要输出-1. 

【输入】

第一行4个整数:N,G,B和D

接下来N行,每行两个整数表示X_i和 Y_i。

 

【输出】

一个整数,表示完成旅行的最小花费,或者-1。

 

【输入输出样例1】

fule.in

fule.out

4 10 3 17

2 40

9 15

5 7

10 12

174

在第一个加油点 加2升,在第5个加油点加满10升,再到第10个加油点加2升,一共花费174.

 

【数据范围】

30%  数据保证  N<=100   G<=1000  D<=10000  

60%  数据保证  N<=5000  G<=1000  D<=10000000 

100% 数据 1 <= G <= 1,000,000  1 <= D <= 1,000,000,000  1 <= N <= 50,000

 

输出-1得30哈哈哈哈

看不懂我放弃了,回来找找贪心的做法。

 

1.旅程

  (journey.pas/c/cpp)

【问题描述】

给出一个长度为 N 的由小写字母’a’~’z’和’*’组成的字符串 A,一个长度为 M 的仅由小

写字母’a’~’z’组成的字符串 B。一个’*’可以匹配任意多个字符(包括 0 个)。求在 B 的所有 循环同构串中,有多少个能够与 A 匹配。

循环同构串:就是把 B 的前 k 个字母(0<=k<M)移到结尾所得到的字符串。例如 abc 的 循环同构串有 abc、bca 和 cab。

A 与 B 匹配:若除了 A 中的’*’号可以匹配 B 中的任意多个字符外,其余字符一一对应, 则称 A 与 B 匹配。例如 a*b*c 与 aadbc 是匹配的,其中第一个*对应 ad,第二个*对应空串。

 

 

【输入】

第一行为字符串 A。

第二行为字符串 B。

 

【输出】

输出在 B 的所有循环同构串中,有多少个能够与 A 匹配

 

【输入输出样例1】

journey.in

journey.out

aaaa

aaaa

4

 

【输入输出样例2】

journey.in

journey.out

a*a

aaaaaa

6

【输入输出样例3】

journey.in

journey.out

*a*b*c*

abacabadabacaba

15

 

【数据范围】

对于 30% 的测试点,M≤20。

对于 80% 的测试点,M≤200。

对于 100% 的测试点,1<=N<=100,1≤M≤100000。

 

这题有好多个题解...然而我不会...

 

转载于:https://www.cnblogs.com/Kaike/p/6063163.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值