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。
这题有好多个题解...然而我不会...