1001
Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByte
Total Submit: 61 Accepted: 50
Description
输入三个整数,找出其中的中间数(根据数值大小)。
Input
输入3个整数。
Output
输出中间数
Sample Input
1 2 3
Sample Output
2
直接sort
#include
using namespace std;
int a[5];
int main()
{
cin>>a[0]>>a[1]>>a[2];
sort(a,a+3);
cout<
1002
Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByte
Total Submit: 59 Accepted: 50
Description
大家都知道,手机号是一个11位长的数字串,同时,作为学生,还可以申请加入校园网,如果加入成功,你将另外拥有一个短号。假设所有的短号都是是 6+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。
现在,如果给你一个11位长的手机号码,你能找出对应的短号吗?
Input
输入数据的第一行是一个N(N <= 200),表示有N个数据,接下来的N行每一行为一个11位的手机号码。
Output
输出应包括N行,每行包括一个对应的短号,输出应与输入的顺序一致。
Sample Input
2
13512345678
13787654321
Sample Output
645678
654321
直接substr
#include
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
string s;
cin>>s;
cout<<"6"<
1003
Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByte
Total Submit: 60 Accepted: 50
Description
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
已经告诉你了,这是个DP的题目,你能AC吗?
Input
输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
Output
对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。
Sample Input
1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
dp的模板题,从上到下最大,你每次选最大并不一定最大
但是你从下到上最大就是最大了,每次取的都是正下方和右下方的
#include
using namespace std;
int a[105][105],dp[105][105];
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=1; i<=n; i++)
for(int j=1; j<=i; j++)cin>>a[i][j];
for(int i=1; i<=n; i++)dp[n][i]=a[n][i];
for(int i=n-1; i>0; i--)
for(int j=1; j<=i; j++)dp[i][j]=max(dp[i+1][j],dp[i+1][j+1]),dp[i][j]+=a[i][j];
cout<
1004
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 71 Accepted: 48
Description
有一些01字串,将其按1的个数的多少的顺序进行输出,如果1的个数相同,请按照字典序顺序输出。
Input
第一行是一个正整数n,表示01字串的个数
接下来有n行,每行是一个01字串(长度不超过2010)。
Output
输出排序后的结果,每行一个01字串
Sample Input
6
10011111
00001101
1010101
1
0
1100
Sample Output
0
1
1100
00001101
1010101
10011111
直接sort,把n求出来可以减少不少复杂度
众所周知sort函数大概是nlogn复杂度的,cmp函数会调用nlogn次,每次访问一遍,就要乘上长度,多了个log
#include
using namespace std;
struct T
{
string s;
int n;
};
int main()
{
vectorV;
int n;
cin>>n;
string s;
for(int i=0;i>s,V.push_back({s,0});
for(int i=0;i
1005
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 135 Accepted: 39
Description
台州学院图书馆是一个馆藏丰富、发展迅速的地方性大学图书馆,截止2010年底,图书馆拥有馆藏纸质文献159.7万册。当然图书然必须具备一个图书查询系统,以便同学快速找到某一本书,请编写一个程序实现。
Input
测试数据有多组。
每一组测试数据第一行为一个正整数n(n<=10000),代表有n本图书;
接下来为n行图书信息:
Ai Bi
Ai和Bi 均为长度不大于100的字符串,Ai为书名,例如“c#.net”,Bi为图书的检索号,例如“TP393.08-4312132”,代表了该书存放的位置,n本图书的信息已经根据Ai的字典序排序后输入。
接下来为一个正整数m(m<=10000),代表查询的次数;
下面的m行,每行为待查询的书名si (si为长度不大于100的字符串)。
Output
对于每一个查询操作,若存在该书目,则输出对应的检索号,否则输出can’t find
Sample Input
5
algorithm TT6589.965
clock CX951.268
computer TP21398.123
english TP65.125
math TP98652.369
3
computer
algorithm
graphics
Sample Output
TP21398.123
TT6589.965
can’t find
直接map的题目,注意不要进行下标访问,会多一个键为访问值值为默认值的Node
#include
using namespace std;
int main()
{
int n;
while(cin>>n)
{
mapM;
string s,c;
for(int i=0;i>s>>c,M[s]=c;
int m;
cin>>m;
while(m--)
{
cin>>s;
if(M.count(s))cout<
1006
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 63 Accepted: 47
Description
小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。
为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。
Input
每个输入包含1个测试用例。每个测试用例分别在2行中先后给出摊主的珠串和小红想做的珠串,两串都不超过1000个珠子。
Output
如果可以买,则在一行中输出“Yes”以及有多少多余的珠子;如果不可以买,则在一行中输出“No”以及缺了多少珠子。其间以1个空格分隔。
Sample Input
ppRYYGrrYBR2258
YrR8RrY
Sample Output
Yes 8
Hint
输入样例2:
ppRYYGrrYB225
YrR8RrY
输出样例2:
No 2
大概是pintia拉来的模拟题,相等的标记下,然后就搞一下,毕竟没有复杂的要求
#include
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
int l1=a.length(),l2=b.length();
for(int i=0; i
1007
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 65 Accepted: 48
Description
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 这10个片段。
给定正整数数列,求出全部片段包含的所有的数之和。如本例中10个片段总和是0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0。
Input
输入第一行给出一个不超过105的正整数N,表示数列中数的个数,第二行给出N个不超过1.0的正数,是数列中的数,其间以空格分隔。
Output
在一行中输出该序列所有片段包含的数之和,精确到小数点后2位。
Sample Input
4
0.1 0.2 0.3 0.4
Sample Output
5.00
这个好像也是pintia的,很快就会发现一个数会在哪些片段,也就是他要出现几次
#include
using namespace std;
int main()
{
int n;
cin>>n;
double x,sum=0;
for(int i=0; i>x,sum+=x*(i+1)*(n-i);
printf("%.2f",sum);
return 0;
}
1008
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 108 Accepted: 24
Description
大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是第4个字母’D’,代表星期四;第2对相同的字符是’E’,那是第5个英文字母,代表一天里的第14个钟头(于是一天的0点到23点由数字0到9、以及大写字母A到N表示);后面两字符串第1对相同的英文字母’s’出现在第4个位置(从0开始计数)上,代表第4分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。
Input
输入在4行中分别给出4个非空、不包含空格、且长度不超过60的字符串。
Output
在一行中输出约会的时间,格式为“DAY HH:MM”,其中“DAY”是某星期的3字符缩写,即MON表示星期一,TUE表示星期二,WED表示星期三,THU表示星期四,FRI表示星期五,SAT表示星期六,SUN表示星期日。题目输入保证每个测试存在唯一解。
Sample Input
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
Sample Output
THU 14:04
这是个比较复杂的模拟题,你需要先求出星期几,然后再求一个数字,这时候应该去结束掉,因为最后一个数字在s3和s4上,然后特殊情况注意下就好了
#include
using namespace std;
string week[8];
int main()
{
string s1,s2,s3,s4,week[8];
cin>>s1>>s2>>s3>>s4;
week[1]="MON",week[2]="TUE",week[3]="WED",week[4]="THU",week[5]="FRI",week[6]="SAT",week[7]="SUN";
int f=0;
for(int i=0; s1[i]&&s2[i]; i++)
{
if(!f&&s1[i]==s2[i]&&s1[i]>='A'&&s1[i]<='G')cout<='A'&&s1[i]<='N')
{
cout<
1009
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 89 Accepted: 31
Description
给定一个数n,问是否可以按从左到右的顺序从其中取出连续的若干位组合成一个素数(大于1,且只能被1和自身整除的数称为素数),若有多种可能,则取所有可能的数中最大的一个。
如在1234中,我们可以取1234,123,234,12,23,34,1,2,3,4,发现素数有2,3,23,其中最大的素数为23。
Input
输入数据有多组,每组占一行,每行一个正整数n(2<=n<=2147483647)。
Output
对于每组输出,若存在,则输出最大的素数,否则输出None
Sample Input
1234
Sample Output
23
这个就是substr求出所有子串,stringsteam或者sscanf(string用.c_str()函数)得到所有值,进行sqrt(n)的素数判断就好了
#include
using namespace std;
int la(int x)
{
if(x<2)return 0;
if(x==2)return 1;
int y=sqrt(x+0.5);
for(int i=2;i<=y;i++)if(x%i==0)return 0;
return 1;
}
int main()
{
string s;
while(cin>>s)
{
setS;
int l=s.length();
for(int i=0;ians;
for(auto X:S)
{
int x;
stringstream ss(X);
ss>>x;
if(la(x))ans.insert(x);
}
if(ans.size())
cout<<*ans.rbegin()<<"\n";
else cout<<"None\n";
}
return 0;
}
1010
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 54 Accepted: 34
Description
宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”
现给出一批考生的德才分数,请根据司马光的理论给出录取排名。
Input
输入第1行给出3个正整数,分别为:N(<=105),即考生总数;L(>=60),为录取最低分数线,即德分和才分均不低于L的考生才有资格被考虑录取;H(<100),为优先录取线??德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线L的考生也按总分排序,但排在第三类考生之后。
随后N行,每行给出一位考生的信息,包括:准考证号、德分、才分,其中准考证号为8位整数,德才分为区间[0, 100]内的整数。数字间以空格分隔。
Output
输出第1行首先给出达到最低分数线的考生人数M,随后M行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
Sample Input
14 60 80
10000001 64 90
10000002 90 60
10000011 85 80
10000003 85 80
10000004 80 85
10000005 82 77
10000006 83 76
10000007 90 78
10000008 75 79
10000009 59 90
10000010 88 45
10000012 80 100
10000013 90 99
10000014 66 60
Sample Output
12
10000013 90 99
10000012 80 100
10000003 85 80
10000011 85 80
10000004 80 85
10000007 90 78
10000006 83 76
10000005 82 77
10000002 90 60
10000014 66 60
10000008 75 79
10000001 64 90
又是一个sort的模拟题,直接模拟呀
#include
using namespace std;
struct T
{
int id,d,c;
} x;
int main()
{
int n,l,h,cnt=0;
cin>>n>>l>>h;
vectorV[4];
while(n--)
{
cin>>x.id>>x.d>>x.c;
if(x.d>=l&&x.c>=l)
{
cnt++;
if(x.d>=h&&x.c>=h)V[0].push_back(x);
else if(x.d>=h&&x.c=x.c)V[2].push_back(x);
else V[3].push_back(x);
}
}
cout<b.d+b.c;
if(a.d!=b.d) return a.d>b.d;
return a.id
1011
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 57 Accepted: 22
Description
在一些迷宫游戏中,往往有多个关卡,每个关卡有不同的地图,地图往往是由n行m列的方格组成,每个格子上可能是通道、墙壁、道具、玩家等。在设计时,我们往往需要通过地图编辑器生成地图,并存入文件中,游戏每关开始时直接从文件中导入并显示。
地图数据往往较大,因此我们准备将地图数据进行压缩编码存储,这样导入时就需要重新解码。
我们约定,原始地图中的通道用".“字符表示,墙壁用”#"字符表示,大写字母A~Z来表示其它元素,换行符表示方格的下一行,除此之外没有别的字符。
在编码时,我们将连续多个的字符通过“个数+字符”的形式存储,换行符使用“!”来表示。
比如地图数据:
#…#
#AAA#
编码后为:
5#!1#3.1#!1#3A1#!5#
注意地图的最后一行总是不对换行进行编码。
你的任务是如果输入是地图数据,请对它进行编码,如果是编码后的地图,请对其进行解码。
Input
输入数据有多组,每组的数据包括:
第一行为字符串Encode或Decode,表示要对下面的数据进行编码或解码。
如果是编码,接下来一行为2个整数n和m,下面有n行m列数据,表示地图数据;
如果是解码,接下来一行为待解码的地图数据;
输入直到EOF为止。其中原始地图数据的行数和列数均不超过100。
Output
每组输出编码后的地图数据或者解码后的地图数据。
Sample Input
Encode
4 5
#…#
#AAA#
Decode
5#!1#3.1#!1#3A1#!5#
Sample Output
5#!1#3.1#!1#3A1#!5#
#…#
#AAA#
解码还是比较好写的,但是编码其实也就是把三种情况枚举下啊,水题无误
#include
using namespace std;
void la()
{
string s[105];
int n,m;
cin>>n>>m;
for(int i=0; i>s[i];
for(int i=0,a,b,c; i>s;
for(int i=0,t; s[i]; i++)
{
if(isdigit(s[i]))
{
int t=0;
for(; isdigit(s[i]); i++)t=t*10+(s[i]-'0');
for(int j=0; j>cmd)
{
if(cmd[0]=='E')la();
else lb();
}
return 0;
}
1012
Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByte
Total Submit: 44 Accepted: 24
Description
给定K个整数的序列{ N1, N2, …, NK },其任意连续子序列可表示为{ Ni, Ni+1, …,
Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
子序列的第一个和最后一个元素。
Input
测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( < 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
Sample Input
6
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3 7 -21
6
5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0
Sample Output
20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0
Hint
Huge input, scanf is recommended.
可以按照题意去模拟,其实就是一个贪心的思想,你大了肯定会选,负数了还不如是0呢,所以更新下
#include
using namespace std;
int a[10005];
int main()
{
int n;
while(cin>>n,n)
{
for(int i=0; i>a[i];
int ma=-1e9,t=0,l=0,r=0,tl=0,tr=0;
for(int i=0; i
1013
Time Limit(Common/Java):1000MS/3000MS Memory Limit:32768KByte
Total Submit: 65 Accepted: 34
Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
最短路,dij直接写啊,习惯不加vis缩减代码,大家可以加上,就多两行
#include
using namespace std;
#define v first
#define w second
struct T
{
int to,w;
bool operator <(T a)const
{
return w>a.w;
}
}t,x;
vector >G[105];
const int INF=0x3f3f3f3f;
int dis[105];
void dij(int s)
{
priority_queueq;
memset(dis,INF,sizeof dis),dis[s]=0,q.push({s,0});
while(!q.empty())
{
x=q.top(),q.pop();
int u=x.to;
for(auto X:G[u])if(dis[X.v]>dis[u]+X.w)dis[X.v]=dis[u]+X.w,q.push({X.v,dis[X.v]});
}
}
int main()
{
int n,m;
while(cin>>n>>m,n||m)
{
for(int i=1;i<=n;i++)G[i].clear();
for(int i=0,u,v,w;i>u>>v>>w,G[u].push_back({v,w}),G[v].push_back({u,w});
dij(1);
cout<
1014
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 14 Accepted: 6
Description
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。
Input
输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。
Output
对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。
Sample Input
3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0
Sample Output
Yes
No
我记得很久之前我是并查集过的,但是这次屡屡写崩,直接tarjan了,其实就是加一个时间戳
#include
using namespace std;
const int N=10005;
int cnt,tot;
int dfn[N],low[N];
int Stack[N],instack[N],top;
vectorG[N];
void init()
{
cnt=0,tot=0,top=0;
for(int i=1;i>n>>m,n||m)
{
init();
for(int i=0,u,v;i>u>>v,G[u].push_back(v);
tarjan(1);
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
printf(cnt==1?"Yes\n":"No\n");
}
return 0;
}
找到了以前并查集的代码
#include
const int M=100005;
int n,m,p[M],q[M];
int la(int x)
{
if(p[x]!=x&&p[x]!=1)p[x]=la(p[x]);
return p[x];
}
int lb(int x)
{
if(q[x]!=x&&q[x]!=1)q[x]=lb(q[x]);
return q[x];
}
int main()
{
while(scanf("%d%d",&n,&m),n||m)
{
for(int i=0; i<=n; i++)
p[i]=q[i]=i;
for(int i=0,x,y; i1)p[x]=la(y);
if(y>1)q[y]=lb(x);
}
int f=0;
for(int i=1; i<=n; i++)
if(la(i)!=1||lb(i)!=1)
{
f=1;
break;
}
printf("%s\n",f?"No":"Yes");
}
return 0;
}
1015
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 43 Accepted: 21
Description
给定n个数据,有两个操作,加减其中的一个数据,当然还可查询在某段数据的和。
Input
输入数据有多组,每组数据的
第一行输入n,1=
第三行输入m,1<=m<=100000,表示操作的次数。包含了修改和查询操作。
下面m行就是具体的操作了。
C i x 表示为第i个元素加上x,x范围在1到10000.
Q i j 表示查询区段i到j的和。保证输入的i<=j.
以EOF结束。
Output
输出查询后的区段和。
Sample Input
8
1 5 9 11 2 8 15 6
4
Q 1 3
C 2 10
Q 1 4
Q 2 5
Sample Output
15
36
37
Hint
提示:类型最好定义为__int64
树状数组呀,很简单的,知道lowbit就成
树状数组模板(改点求段 / 该段求点 / 改段求段)
#include
using namespace std;
typedef long long ll;
const int N=500005;
ll c[N];
int n;
void add(int x,int d)
{
for(;x<=n;x+=x&-x)c[x]+=d;
}
ll sum(int x)
{
ll ans=0;
for(;x>0;x-=x&-x)ans+=c[x];
return ans;
}
int main()
{
while(cin>>n)
{
memset(c,0,sizeof c);
for(int i=1,x;i<=n;i++)scanf("%d",&x),add(i,x);
int m;
cin>>m;
while(m--)
{
string s;
int a,b;
cin>>s>>a>>b;
if(s[0]=='Q')cout<