xtu补考题解
2016-11-01 21:07
211 查看
转载注明出处:http://blog.csdn.net/xtulollipop
题目描述
机器人一开始站在原点,可以上下左右(分别用“UDLR”表示)移动,每次移动一步。Estrella想知道对于某个指令序列,如果把一种指令全部替换成另一种指令,新的指令序列是否可以让机器人回到原点。
输入
存在多个样例,每个样例一行,为一条指令序列,长度不超过200。
输出
每行输出一个样例的结果,可以输出“Yes”,否则输出“No”。
样例输入
LD
LLDDD
样例输出
Yes
No
对于这个问题,如果要是机器人回到原点,那么L,R的数目应该相等,U,D的数目也应该相等。由于题目说了把其中一种全部替换,那么这个题要使得机器人回到原点那么有L=R或者U=D,所以我们只需要对这种情况进行判断就行。
对于这个题,每一行,每一列中只要有一个黑色的那么这一行,这一列是不会被刷成红色的,因此每输入一个点,我就标记行列是否有红色,最后我只要知道有多少行,多少列没出现过黑色,那么我就可以知道又少个各自被涂成红色了,,h*m+l*n-h*l,h行的个数每行格子数+列数每列格子数-行列交叉点(多算了一次)。
整套题里,最烦的一到模拟题题了。。用一个数组表示是否有课,检查连着的T节课是否全是空的,且时间全是上午,下午或晚上。
这个题,其实就是找规律的题,全场都没有人出,自己写了样例都过不去,后来几个人在一起对拍了数据,发现这题数据好像出错了。然后找了老师,果然他数据错了。。so。。怪谁呢。。。1000000000的那个样例的答案因该是499999881。。
然后说一下这个题,,观察几行可以发现规律1,22,22+1,42,42+1,62,62+1…那么前几行就是这些的求和了。。。顺便总结一下公式:
1+2+3+4+..+n=n(n+1)2
1+3+5+..+(2n−1)=n2
2+4+6+..+(2n)=n(n+1)
12+22+32+...+n2=n(n+1)(2n+1)6
12+32+52+...+(2n−1)2=n(4n2−1)3
22+42+62+...+(2n)2=2n(n+1)(2n+1)3
13+23+33+...+n3=n2(n+1)24
……
那么之后又出现一个问题,2n(n+1)(2n+1),,这个有多大?long long 存的下吗?int 的最大值是2,147,483,647,long long 的最大值9,223,372,036,854,775,807,,显然n==1e9的时候long long 都存不下。。
解决办法1:这只有3个数讨论一下,就知道有一个肯定能整除3,,搞掉就好。。
解决办法2:用大数来写,当然还是java好啦。。。
然后又来总结一波java大数类BigInteger里常用的的一些东西。。
Ⅰ基本函数:
1.valueOf(parament); 将参数转换为制定的类型
比如int a=3;–>BigInteger b=BigInteger.valueOf(a),所以b=3;
String s=”12345”; BigInteger c=BigInteger.valueOf(s);则c=12345;
2.add(); 大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a=a. add(b);..之后a=57
3.subtract(); 相减
4.multiply(); 相乘
5.divide(); 相除取整
6.remainder(); 取余
7.pow(); a.pow(b)=a^b
8.gcd(); 最大公约数
9.abs(); 绝对值
10.negate();取反数
11.mod(); a.mod(b)=a%b=a.remainder(b);
12.max(); min();
13.punlic int comareTo();
14.boolean equals(); 是否相等
15.BigInteger构造函数:
一般用到以下两种:
BigInteger(String val);
将指定字符串转换为十进制表示形式;
BigInteger(String val,int radix);
将指定基数的 BigInteger的字符串表示形式转换为BigInteger
Ⅱ.基本常量: A=BigInteger.ONE 1
Ⅲ.基本操作
读入:用Scanner类定义对象进行控制台读入,Scanner类在java.util.*包中
Scanner cin=new Scanner(System.in);// 读入
while(cin.hasNext()) { //等同于!=EOF
int n;
BigInteger m;
n=cin.nextInt(); //读入一个int;
m=cin.BigInteger();//读入一个BigInteger;
System.out.print(m.toString());
}
然后是这个题的代码。。
这个题才好像是签到题,可惜榜歪了,并且这个题太靠后了,很少有人看到这个题。对于一些数+x,一些是+y…也就是说我只能让两个不相同的数变成第三个数或则让它两相等。。。那么答案就是这个序列是否只有3种以内的数(一种,两种,三种)。。。其他都是NO。。。。
总结一下常见的c++模板库的东西:
quque:队列,数据先进先出。
stack:栈,数据先进后出
vector:容器,不定数组(直接当队列使用)
set:集合,(无重复元素)
multiset多重集合,(可以有重复元素)
这些模板很好用。。可以自己查阅api,参考学习。
最长回文子序列
题目描述
给一个字符串,任取若干个字符,按照其在字符串中的相对顺序,组成的序列,我们称其为子序列。如果这个子序列是回文的,我们称其为回文子序列。求一个字符串最长回文子序列的长度。
输入
存在多个样例(样例数量不超过100),每行一个字符串,字符串只包含英文小写字母,长度不超过1000。
输出
每行输出一个样例的结果。
样例输入
abcd
aabb
abab
abcba
样例输出
1
2
3
5
最后一个题:原题。。怪我咯。。。
有一个算法叫做求最长公共序列。就是求两个串最长的相同的子串
我们可以知道回文串左右看都是一样,,那么一个串的最长回文子串,就相当于这个串与它的逆序串的最长公共序列了。。当然这个题也可以用回文串自动机(这个可能很少有人会)。
so。。
直接套上算法模板:(不知道的人当然就不会啦)
受一朋友委托,写了这个题解供大家学习使用,本文代码只是自己看到题目后写的,并没有交题验证过其正确性,因此仅供参考学习交流使用。也请勿照抄代码。不喜勿碰!
Robot题目描述
机器人一开始站在原点,可以上下左右(分别用“UDLR”表示)移动,每次移动一步。Estrella想知道对于某个指令序列,如果把一种指令全部替换成另一种指令,新的指令序列是否可以让机器人回到原点。
输入
存在多个样例,每个样例一行,为一条指令序列,长度不超过200。
输出
每行输出一个样例的结果,可以输出“Yes”,否则输出“No”。
样例输入
LD
LLDDD
样例输出
Yes
No
对于这个问题,如果要是机器人回到原点,那么L,R的数目应该相等,U,D的数目也应该相等。由于题目说了把其中一种全部替换,那么这个题要使得机器人回到原点那么有L=R或者U=D,所以我们只需要对这种情况进行判断就行。
#include<bits/stdc++.h> using namespace std; int main(){ char a[222]; while(scanf("%s",a)!=EOF){ int L=0,R=0,U=0,D=0; for(int i=0;i<strlen(a);i++){ if(a[i]=='L') L++; else if(a[i]=='R') R++; else if(a[i]=='U') U++; else if(a[i]=='D') D++; } bool ok=false; //判断L==R,把U替换和把D替换 if(L==R+U||L==R+D||R==L+U||R==L+D) ok=true; //判断D==U if(D==U+L||D==U+R||U==D+L||U==D+R) ok=true; if(ok) printf("Yes\n"); else printf("No\n"); } return 0; }
对于这个题,每一行,每一列中只要有一个黑色的那么这一行,这一列是不会被刷成红色的,因此每输入一个点,我就标记行列是否有红色,最后我只要知道有多少行,多少列没出现过黑色,那么我就可以知道又少个各自被涂成红色了,,h*m+l*n-h*l,h行的个数每行格子数+列数每列格子数-行列交叉点(多算了一次)。
#include<cstdio> using namespace std; int main() { int t; scanf("%d",&t); while(t--){ int hang[110],lie[110]; int n,m,k,x,y; scanf("%d %d %d",&n,&m,&k); for(int i=1;i<=110;i++){ hang[i]=0; lie[i]=0; } for(int i=1;i<=k;i++){ scanf("%d %d",&x,&y); hang[x]=1;//标记行是否出现过黑色 lie[y]=1;//标记列是否出现过黑色 } int h=0,l=0; for(int i=1;i<=n;i++){ if(hang[i]==0) h++; } for(int i=1;i<=m;i++){ if(lie[i]==0) l++; } printf("%d\n",h*m+l*n-h*l); } return 0; }
整套题里,最烦的一到模拟题题了。。用一个数组表示是否有课,检查连着的T节课是否全是空的,且时间全是上午,下午或晚上。
#include<bits/stdc++.h> using namespace std; char week[8][8]={"","Mon","Tue","Wen","Thur","Fri","Sat","Sun"}; int main(){ int T_T; scanf("%d",&T_T); while(T_T--){ int N,T; scanf("%d %d",&N,&T); int xin[11][11];//星期几,第几节课,1代表有课,0代表没课 memset(xin,0,sizeof(xin)); char D[11]; int S,E; for(int i=1;i<=N;i++){ scanf("%s %d %d",D,&S,&E); for(int j=1;j<=7;j++){ if(strcmp(D,week[j])==0){ for(int k=S;k<=E;k++) xin[j][k]=1; //星期一S到E节课有课。。 } } } int cnt=0; //找到没课节数等于考试数T的地方 for(int i=1;i<=5;i++){//枚举星期1-5 for(int s=1;s<=11;s++){ //枚举开始的节数 int num=0,jie; for(jie=0;jie<T;jie++){ //连着的T节课 num+=xin[i][s+jie]; //只要num!=0,表示连着的T课时间里有课。 if(s+jie==4||s+jie==8||s+jie==11){//上午,下午,晚上分界处, if(jie==T-1&&num==0) cnt++; //循环到了T截课(循环没执行完T-1) break; } } if(jie==T&&num==0) cnt++;//盘jie==T,是检查是否是上下午晚上时间段的 } } printf("%d\n",cnt);//与上边相同,只是在cnt++的地方改成输出就好了。 for(int i=1;i<=5;i++){ for(int s=1;s<=11;s++){ int num=0,jie; for(jie=0;jie<T;jie++){ num+=xin[i][s+jie]; if(s+jie==4||s+jie==8||s+jie==11){ if(jie==T-1&&num==0) printf("%s %d %d\n",week[i],s,s+jie); break; } } if(jie==T&&num==0) printf("%s %d %d\n",week[i],s,s+jie); } } } return 0; }
这个题,其实就是找规律的题,全场都没有人出,自己写了样例都过不去,后来几个人在一起对拍了数据,发现这题数据好像出错了。然后找了老师,果然他数据错了。。so。。怪谁呢。。。1000000000的那个样例的答案因该是499999881。。
然后说一下这个题,,观察几行可以发现规律1,22,22+1,42,42+1,62,62+1…那么前几行就是这些的求和了。。。顺便总结一下公式:
1+2+3+4+..+n=n(n+1)2
1+3+5+..+(2n−1)=n2
2+4+6+..+(2n)=n(n+1)
12+22+32+...+n2=n(n+1)(2n+1)6
12+32+52+...+(2n−1)2=n(4n2−1)3
22+42+62+...+(2n)2=2n(n+1)(2n+1)3
13+23+33+...+n3=n2(n+1)24
……
那么之后又出现一个问题,2n(n+1)(2n+1),,这个有多大?long long 存的下吗?int 的最大值是2,147,483,647,long long 的最大值9,223,372,036,854,775,807,,显然n==1e9的时候long long 都存不下。。
解决办法1:这只有3个数讨论一下,就知道有一个肯定能整除3,,搞掉就好。。
解决办法2:用大数来写,当然还是java好啦。。。
然后又来总结一波java大数类BigInteger里常用的的一些东西。。
Ⅰ基本函数:
1.valueOf(parament); 将参数转换为制定的类型
比如int a=3;–>BigInteger b=BigInteger.valueOf(a),所以b=3;
String s=”12345”; BigInteger c=BigInteger.valueOf(s);则c=12345;
2.add(); 大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a=a. add(b);..之后a=57
3.subtract(); 相减
4.multiply(); 相乘
5.divide(); 相除取整
6.remainder(); 取余
7.pow(); a.pow(b)=a^b
8.gcd(); 最大公约数
9.abs(); 绝对值
10.negate();取反数
11.mod(); a.mod(b)=a%b=a.remainder(b);
12.max(); min();
13.punlic int comareTo();
14.boolean equals(); 是否相等
15.BigInteger构造函数:
一般用到以下两种:
BigInteger(String val);
将指定字符串转换为十进制表示形式;
BigInteger(String val,int radix);
将指定基数的 BigInteger的字符串表示形式转换为BigInteger
Ⅱ.基本常量: A=BigInteger.ONE 1
B=BigInteger.TEN 10 C=BigInteger.ZERO 0
Ⅲ.基本操作
读入:用Scanner类定义对象进行控制台读入,Scanner类在java.util.*包中
Scanner cin=new Scanner(System.in);// 读入
while(cin.hasNext()) { //等同于!=EOF
int n;
BigInteger m;
n=cin.nextInt(); //读入一个int;
m=cin.BigInteger();//读入一个BigInteger;
System.out.print(m.toString());
}
然后是这个题的代码。。
import java.math.BigInteger; import java.util.Scanner; public class Main { private static Scanner in; //计算2^2+4^4+...+(2n)^2 public static BigInteger sum(BigInteger x){ BigInteger temp=BigInteger.ONE; temp=temp.multiply(x).multiply(BigInteger.valueOf(2)); temp=temp.multiply(x.add(BigInteger.ONE)); temp=temp.multiply(x.multiply(BigInteger.valueOf(2)).add(BigInteger.ONE)); temp=temp.divide(BigInteger.valueOf(3)); return temp; } public static void main(String[] args) { in = new Scanner(System.in); BigInteger n; while(true){ n=in.nextBigInteger(); if(n.mod(BigInteger.valueOf(2)).equals(BigInteger.ZERO)){ //sum(n)+sum(n-1)+n n=n.divide(BigInteger.valueOf(2)); BigInteger temp=sum(n).add(sum(n.subtract(BigInteger.ONE)).add(n)); System.out.println(temp.mod(BigInteger.valueOf(1000000007))); } else{ //2*sum(n)+1+n n=n.divide(BigInteger.valueOf(2)); BigInteger temp=sum(n).add(sum(n)).add(n).add(BigInteger.ONE); System.out.println(temp.mod(BigInteger.valueOf(1000000007))); } } } }
这个题才好像是签到题,可惜榜歪了,并且这个题太靠后了,很少有人看到这个题。对于一些数+x,一些是+y…也就是说我只能让两个不相同的数变成第三个数或则让它两相等。。。那么答案就是这个序列是否只有3种以内的数(一种,两种,三种)。。。其他都是NO。。。。
总结一下常见的c++模板库的东西:
quque:队列,数据先进先出。
stack:栈,数据先进后出
vector:容器,不定数组(直接当队列使用)
set:集合,(无重复元素)
multiset多重集合,(可以有重复元素)
这些模板很好用。。可以自己查阅api,参考学习。
#include<bits/stdc++.h> using namespace std; int main(){ int T_T; scanf("%d",&T_T); while(T_T--){ int n,x; set<int>Q; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&x); Q.insert(x); } if(Q.size()<=3) printf("Yes\n"); else printf("No\n"); } return 0; }
最长回文子序列
题目描述
给一个字符串,任取若干个字符,按照其在字符串中的相对顺序,组成的序列,我们称其为子序列。如果这个子序列是回文的,我们称其为回文子序列。求一个字符串最长回文子序列的长度。
输入
存在多个样例(样例数量不超过100),每行一个字符串,字符串只包含英文小写字母,长度不超过1000。
输出
每行输出一个样例的结果。
样例输入
abcd
aabb
abab
abcba
样例输出
1
2
3
5
最后一个题:原题。。怪我咯。。。
有一个算法叫做求最长公共序列。就是求两个串最长的相同的子串
void copyn(int c[],int d[]){ for(int i=0;i<n;i++) c[i]=d[i]; } int LCS(char x[],char y[]){ int mm=0; memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(y[i]==x[j]) dp[1][j+1]=dp[0][j]+1; else dp[1][j+1]=max(dp[1][j],dp[0][j+1]); mm=max(mm,dp[1][j+1]); } copyn(dp[0],dp[1]); memset(dp[1],0,sizeof(dp[1])); } return mm; }
我们可以知道回文串左右看都是一样,,那么一个串的最长回文子串,就相当于这个串与它的逆序串的最长公共序列了。。当然这个题也可以用回文串自动机(这个可能很少有人会)。
so。。
直接套上算法模板:(不知道的人当然就不会啦)
#include<bits/stdc++.h> using namespace std; char a[1005],b[1005]; int dp[2][1005],n; void copyn(int c[],int d[]){ for(int i=0;i<n;i++) c[i]=d[i]; } int LCS(char x[],char y[]){ int mm=0; memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(y[i]==x[j]) dp[1][j+1]=dp[0][j]+1; else dp[1][j+1]=max(dp[1][j],dp[0][j+1]); mm=max(mm,dp[1][j+1]); } copyn(dp[0],dp[1]); memset(dp[1],0,sizeof(dp[1])); } return mm; } int main(){ while(scanf("%s",a)!=EOF){ n=strlen(a); for(int i=0;i<n;i++) b[i]=a[n-i-1]; printf("%d\n",LCS(a,b)); } return 0; }
相关文章推荐
- 补考马哲~
- 统计各班参加补考的人数
- XTU - 1097 SBB的烦恼
- 二叉树的建立及遍历(前、中、后序) xtu-exam 1004
- CSRGXTU SEO
- XTU1199:Number Game
- xtu summer individual 1 E - Palindromic Numbers
- xtu summer individual 3 F - Opening Portals
- XTU_1168 Alice and Bob
- XTU 1183 Factors
- xtu 1233 Coins && zoj 3747 Attack on Titans
- XTU1238:Segment Tree(线段树)
- XTU 1184 Tourist 1
- 2016长城信息杯中国大学生程序设计竞赛中南邀请赛 xtu 1244 Gambling
- 驾校补考缴费
- XTU 1236 Fraction
- 使用Xtuils3做基本的数据库操作
- XTU1189 ROOT
- 和cattom制定了件合作的事情,cattom考进研究生了也要补考本科的东西真是我的好兄弟:)
- 提取2010年5月份补考名单(以理科为例)