1、标题:海盗分金币
有5个海盗,相约进行一次帆船比赛。
比赛中天气发生突变,他们被冲散了。
恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,
觉得自己是第一个经过该岛的人。
第一个人在沙滩上发现了一堆金币。他把金币分成5等份。
发现刚好少一个金币。他就从自己口袋拿出一个金币补充进去,
然后把属于自己的那份拿走。
第二个到达的人也看到了金币,他也和第一个人一样,
把所有金币5等分,发现刚好缺少一个金币,于是自己补进去一个,
拿走了属于自己的那份。
第三,第四,第五人的情况一模一样。
等他们到了目的地,都说自己的情况,才恍然大悟,
一起去荒岛找金币,然而再也没有找到荒岛。他们都惋惜地说:岛上还有一千多枚金币呢!
请你根据这些信息,推算荒岛上最初有多少金币?
这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)
逆推:枚举最后剩下的1000到1999个金币,向上还原,每次的硬币要能够被4整除。
#include
#include
using namespace std;
typedef long long ll;
#define M 1000000000
void dfs(ll k,ll n,int step){
if(step==5){
cout<
答案:3129
2、标题:六角幻方
把 1 2 3 ... 19 共19个整数排列成六角形状,如下:
* * *
* * * *
* * * * *
* * * *
* * *
要求每个直线上的数字之和必须相等。共有15条直线哦!
再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,、
参见图【p1.png】,黄色一行为所求。
请你填写出中间一行的5个数字。数字间用空格分开。
这是一行用空格分开的整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)
题目分析:如图所示,我们应该构建5行9列的数组
在如图所示,横着5条直线和我红色标识的左斜5条直线,右斜5条直线,每条直线的和相等,因为所填数字是1~19,和为390,
390/5=38,所以每条直线的和要为38。
(题目本身不难,但是这道题我做了很久!!!因为条件判断有误,递归出口出了问题,然后判断斜线的时候只算了3条,太粗心了!!!一定要细心啊啊啊啊啊 啊啊啊啊啊啊)
#include
using namespace std;
#define M 38
int arr[5][9];
int num[17]={1,2,3,4,5,6,7,8,9,10,
11,12,14,16,17,18,19};
int vis[20];
bool is(int x,int y,int &x1,int &y1){ //x,y表示当前行和列,x1,y1表示下一次遍历的行和列
//判断横着的直线是否符合条件
bool flag=true;
if(y-x==6||x==2&&y==7||x==4&&y==6){
int s=0;
for(int i=0;i<9;i++){
s+=arr[x][i];
}
if(s!=M)
return false;
x1=x+1;
if(x1==1||x1==3) //判断直线,即是当前行的最后一列了,所以到下一步要换行,这里换行要分开讨论
y1=1;
if(x1==2)
y1=0;
if(x1==4)
y1=2;
flag=false;//标识,表示已经换行了,避免后面再次给x1,y1赋值
}
//判断左斜着的值线
if(x-y==2||x==4){
int s=0,xx=x,yy=y;
while(xx>=0){
s+=arr[xx--][yy++];
}
if(s!=M)
return false;
}
//判断右斜着的直线
if(x==2&&y==8||x==3&&y==7||x==4&&(y==6||y==4||y==2)){
int s=0,xx=x,yy=y;
while(xx>=0){
s+=arr[xx--][yy--];
}
if(s!=M)
return false;
}
if(x==4){
}
if(flag)//如果前面没有换行,因此在当前行跳过一个空格
y1=y+2,x1=x;
return true;
} //9 6 5 2 16
void dfs(int x,int y){
if(x==4&&y==6){
for(int i=0;i<9;i+=2){
cout<
答 案 : 9 6 5 2 16
3、标题:日期差
历史上,不同的人类聚居地可能有不同的历法,因而记录下来的资料中日期的换算就很麻烦。
幸好今天我们统一使用公元纪年法。当然,这种历法对求两个日期差多少天也不是十分简便,
但毕竟是可以忍受的。
下面的程序计算了两个日期的差值,两个日期都使用公元纪年法。
请分析程序逻辑,并推断划线部分缺失的代码。
int to_day(int y, int m, int d)
{
int mon[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int day = 0;
int i;
for(i=1; iday += (i%4==0 && i%100!=0 || i%400==0)? 366 : 365;
}
if(y%4==0 && y%100!=0 || y%400==0) mon[2]++;
for(i=1; i_____________________; //填空位置
}
return day + d;
}int diff(int y1, int m1, int d1, int y2, int m2, int d2)
{
int a = to_day(y1, m1, d1);
int b = to_day(y2, m2, d2);
return b-a;
}int main()
{
int n = diff(1864,12,31,1865,1,1);
printf("%d\n", n);
return 0;
}
注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字或已有符号)。
#include
using namespace std;
int to_day(int y, int m, int d)
{
int mon[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int day = 0;
int i;
for(i=1; i
答案:day+=mon[i];
4、标题:排列序数
如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:
abcd 0
abdc 1
acbd 2
acdb 3
adbc 4
adcb 5
bacd 6
badc 7
bcad 8
bcda 9
bdac 10
bdca 11
cabd 12
cadb 13
cbad 14
cbda 15
cdab 16
cdba 17
...
现在有不多于10个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?
【输入格式】
一行,一个串。
【输出格式】
一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。
例如:
输入:
bdca
程序应该输出:
11
再例如:
输入:
cedab
程序应该输出:
70
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include
提交时,注意选择所期望的编译器类型。
AC代码:
#include
#include
#include
using namespace std;
char arr[100];
int main(){
cin>>arr;
int n=strlen(arr);
int ans=0;
char temp[100];
strcpy(temp,arr);
sort(temp,temp+n);
do{
ans++;
if(strcmp(temp,arr)==0){
cout<
5、
标题:重复模式
作为 drd 的好朋友,技术男 atm 在 drd 生日时送给他一个超长字符串 S 。
atm 要 drd 在其中找出一个最长的字符串 T ,使得 T 在 S 中至少出现了两次,
而他想说的秘密就藏在 T 中。
由于字符串实在是太长了,drd 总是找不到合适的 T 。
于是 drd 请你帮他找到这个 T 的长度。
【输入格式】
一行。一个字符串,即题目中说的S 。
【输出格式】
一行。一个整数,表示最长的 T 的长度。
【样例输入】
ababa
【样例输出】
3
「数据范围」
对于 30% 的数据,S长度 <= 100
对于 60% 的数据,S长度 <= 8000
对于 100% 的数据,S长度 <= 500000
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include
提交时,注意选择所期望的编译器类型。
#include
#include
#include
using namespace std;
string s;
int mmax=0;
int len;
void dfs(int beg,int end){
int n=end-beg;
string s1=s.substr(beg,n);
for(int i=beg+1;i>s;
len=s.length();
for(int i=0;i
6、标题:供水设施
X星球的居民点很多。Pear决定修建一个浩大的水利工程,
以解决他管辖的N个居民点的供水问题。现在一共有N个水塔,
同时也有N个居民点,居民点在北侧从1号到N号自西向东排成一排;
水塔在南侧也从1号到N号自西向东排成一排。
N条单向输水线(有水泵动力),将水从南侧的水塔引到北侧对应的居民点。
我们不妨将居民点和水塔都看做平面上的点,居民点坐标为(1,K)~(N,K),
水塔为(1,0)~(N,0)。
除了N条纵向输水线以外,还有M条单向的横向输水线,
连接(Xi,Yi)和((Xi)+1,Yi)或者(Xi,Yi)和((Xi)-1,Yi)。前者被称为向右的水路,
而后者是向左的。不会有两条水路重叠,即便它们方向不同。
布局的示意图如:【p1.png】所示。
显然,每个水塔的水都可以到达若干个居民点(而不仅仅是对应的那个)。
例如上图中,4号水塔可以到达3、4、5、6四个居民点。
现在Pear决定在此基础上,再修建一条横向单向输水线。为了方便考虑,
Pear认为这条水路应当是自左向右的,也就是连接了一个点和它右侧的点
(例如上图中连接5和6两个纵线的横向水路)。
Pear的目标是,修建了这条水路之后,能有尽可能多对水塔和居民点之间能到达。
换句话说,设修建之后第i个水塔能到达Ai个点,你要最大化A1+A2+...+An。
根据定义,这条路必须和X轴平行,但Y坐标不一定要是整数。注意:
虽然输入中没有重叠的水路,但是你的方案可以将新修的输水线路与已有的水路重叠。
【输入数据】
输入第一行包含三个正整数N,M,K,含义如题面所述:N是纵向线数,
M横向线数,K是居民点纵坐标。
接下来M行,每行三个整数。前两个正整数Xi Yi表示水路的起点坐标;
1<=Xi<=N,0
保证水路都是合法的,也就是不会流向没有定义的地方。
【输出数据】
输出一行。是一个正整数,即:题目中要求的最大化的A1+A2+...+An。
【输入样例1】
4 3 2
1 1 1
3 1 0
3 1 1
【输出样例1】
11
【输入样例2】
7 9 4
2 3 0
7 2 0
6 3 1
6 1 0
2 1 1
3 3 1
5 2 0
2 2 1
7 1 0
【输出样例2】
21
【数据范围】
对于20%的数据,N,K<=20,M<=100
对于40%的数据,N,K<=100,M<=1000
对于60%的数据,N,K<=1000,M<=100000
对于100%的数据,N,K<=50000,M<=100000
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 4000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include
提交时,注意选择所期望的编译器类型。