目录

1165-算术题

题目描述

代码实现

1184-Tourist 1

题目描述

代码实现

1186-Tourist 2

题目描述

代码实现

1224-LOVE

题目描述

代码实现

1256-湘潭大学

题目描述

代码实现

1253-Robot

题目描述

代码实现

1227-Robot

题目描述

代码实现

1228-Hash

题目描述

代码输入

1252-Matrix Word

题目描述

代码实现

1246-Matrix Transposition

题目描述

代码实现

Z字形

题目描述

代码实现

环形N阶字母矩阵

题目描述

代码实现

1238-Binary String

题目描述

思路

代码实现

1168-填颜色

题目描述

分析

代码实现

1176-First Blood

题目描述

代码实现

119-Balloon2

题目描述

代码实现

1193-Eason

题目描述

代码实现

1214-A+B IV

题目描述

代码实现

1218-A+B VIII

题目描述

代码实现 / C

代码实现 / JAVA

1243-Bob's Password

题目描述

代码实现


1165-算术题

题目描述

小明在做加减法的算术题,有些题他不会做,那么他会不填答案,有些题可能做错了。 请你写个程序,判断一下小明作对了几道题?
输入

每行一个算术式,形如a+b=c,a-b=c,a+b=,a-b=。0≤a,b,c≤100

输出

输出正确的题目数。

样例输入

1+1=2

1+2=4

2-1=1

2-2=

3+6=

样例输出

2

代码实现

#include<bits/stdc++.h>
using namespace std; char s[50]; int main(){
int d1,d2,d3;
int cnt=0;
char op;
while(gets(s)){
d3=1000;
sscanf(s,"%d%c%d=%d",&d1,&op,&d2,&d3);
//printf("%d %d %d\n",d1,d2,d3);
if(d1+d2==d3&&op=='+')
{
cnt++;
}
if(d1-d2==d3&&op=='-')
{
cnt++;
}
}
printf("%d\n",cnt);
return 0;
}

1184-Tourist 1

题目描述

Eric喜欢旅行,今年暑假终于可以有几天时间出去玩了。他计划在去3个不同的城市,而且不想重复去相同的城市,

最后回到出发的城市,他想知道怎么走可以让差旅费用降到最低? 我们把城市编号为0~3,Eric总从0号城市出发。

输入

第一行是一个整数K,表示样例的个数。 每个样例占4行,每行4个整数Xij,第i行第j列个整数表示从城市i到城市j所需要的旅费,

单次费用不超过1000。i = j 时,Xij = 0。

输出

每行输出一个样例的结果,包括两行,第一行是差旅的总费用,第二行是3个城市的编号序列,

每个城市编号之间用一个空格隔开,表示旅行的路线,如果存在多条线路都是最少花费,请输出字典序输出这些线路,每个线路一行。


样例输入

1

0 1 1 1

2 0 2 2

3 3 0 3

4 4 4 0

样例输出

10

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

代码实现

#include<bits/stdc++.h>
using namespace std; int main()
{
int K;
scanf("%d",&K);
while(K--)
{
int s[4][4];
for(int i=0; i<4; i++)
{
for(int j=0; j<4; j++)
{
scanf("%d",&s[i][j]);
}
}
int min=10000;
int cnt,sum,m[30][3];
//接下来的这个多层循环很核心
for(int i=1; i<4; i++)
{
for(int j=1; j<4; j++)
{
if(i==j) continue;
for(int k=1; k<4; k++)
{
if(i==k||j==k) continue;
sum=s[0][i]+s[i][j]+s[j][k]+s[k][0];
if(sum>min)continue;
if(sum<min)//第一次判断一定会经过这儿(而且一旦经过这儿,注意里面cnt=0;这句相当重要)
{
min=sum;
cnt=0;
m[cnt][0]=i;
m[cnt][1]=j;
m[cnt][2]=k;
cnt++;
}
else if(sum==min)//不用担心这个值不是最小值却将它也记录了下来(那是因为如果能跑到这里,说明上面的那个sum<min没满足,那么至少在到目前的比较中,这的确是当前最小的)
{
m[cnt][0]=i;
m[cnt][1]=j;
m[cnt][2]=k;
cnt++;
}
}
}
}
printf("%d\n",min);
for(int i=0;i<cnt;i++)//这儿的cnt最终取值取决于哪里要清楚
{
for(int j=0;j<3;j++)
{
printf("%d",m[i][j]);
if(j<2) printf(" ");
}
printf("\n");
}
}
return 0;
}

1186-Tourist 2

题目描述

求n位01串含连续至少2个1的串的个数。

输入

第一行是一个整数K(K≤10000),表示样例的个数。 每行样例是一个整数n(1≤1000000)。

输出

每行输出一个样例的结果,因为数目可能很大,请对109+7取模。

样例输入

5

1

2

3

4

1000000

样例输出

0

1

3

8

782550144

代码实现

#include <bits/stdc++.h>
using namespace std;
int g[10][10], ans, T, path[111], p[10], pid, vis[10], n;
void dfs(int i, int cnt, int cost) {
if(cnt == n) {
if(cost+g[i][0] < ans) {
ans = cost + g[i][0];
pid = 0;
for(int j = 0; j < n; j++) path[pid++] = p[j];
} else if(cost+g[i][0] == ans && pid < n*10) for(int j = 0; j < n; j++) path[pid++] = p[j];
return;
}
for(int j = 1; j <= n; j++) {
if(!vis[j]) {
vis[j] = true;
p[cnt] = j;
dfs(j, cnt+1, cost+g[i][j]);
vis[j] = false;
}
}
}
int main() {
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
for(int i = 0; i <= n; i++) for(int j = 0; j <= n; j++) scanf("%d", &g[i][j]);
ans = 11111, pid = 0;
memset(vis, false, sizeof(vis));
dfs(0,0,0);
printf("%d\n", ans);
pid = min(pid, n*10);
for(int i = 0; i < pid; i += n) {
for(int j = i; j < i+n; j++) {
if(j%n) putchar(' ');
printf("%d", path[j]);
}
puts("");
}
}
return 0;
}

1224-LOVE

题目描述

给你一个字符串,求存在多少个子序列为"LOVE"? 所谓串的子序列即序列(xi,xj,xk,xt), 假设串共有n个字符,那么1≤i<j<k<t≤n。

输入

第一行是一个整数K(K≤1000),表示样例的个数。 以后每行一个字符串,字符串只含英文大写字母,长度不超过1000个字符。

输出

每个样例输出一行,因为这个值可能非常大,将结果对1000000007取模。


样例输入

4

LOVE

LOVA

LLOOVVEE

LOVELOVE

样例输出

1

0

16

5

代码实现

#include <bits/stdc++.h>
int main() {
int T;
scanf("%d ", &T);
while(T--) {
char s[1001];
gets(s);
int f[4] = {0}, len = strlen(s);
for(int i = 0; i < len; i++) {
if(s[i] == 'L') f[0]++;
if(s[i] == 'O') f[1] += f[0];
if(s[i] == 'V') f[2] += f[1];
if(s[i] == 'E') f[3] += f[2];
}
printf("%d\n", f[3]%1000000007);
}
}

1256-湘潭大学

题目描述

湘潭大学简称“XTU”,作为即将成为湘大的一份子,怎么不能为湘大添砖加瓦了?

现在给你一个字符串,请你计算一下,从中选取字符,最多能组成多少个“XTU”?

输入

第一行是一个整数K,表示样例的个数。 以后每行一个字符串,字符串只包含英文大写字母,长度不会超过1000。

输出

每行输出一个样例的结果。


样例输入

3

XTUUTX

ABCDEFGHIJKLMNOPQRSTUVWXTZ

XXXTTT

样例输出

2

1

0

代码实现

#include<bits/stdc++.h>
using namespace std; int main()
{
int K;
int x,t,u,res;
scanf("%d",&K);
char str[1010];
while(K--)
{
scanf("%s",str);
x=0,t=0,u=0;
for(int i=0; i<strlen(str); i++)
{
if(str[i] == 'X') x++;
if(str[i] == 'T') t++;
if(str[i] == 'U') u++;
}
//printf("%d %d %d\n",x,t,u);
int tt=x<t?x:t;
res=tt<u?tt:u;
printf("%d\n",res);
}
return 0;
}

1253-Robot

题目描述

有N 个任务需要Robot去完成,这个N个任务的地点在一个数轴上,坐标为1 到n 。每个任务需要先完成a i  个任务才能开始去做。Robot可以在直线上左右移动,初始位置位于任务1 的地点,方向朝向数轴正方向。请问Robot最少转换多少次方向可以完成所有的任务。

输入

存在多个样例。每个样例的第一行是一个整数n(1≤n≤1000) ,第二行是一个n 个整数a 1 ,a 2 ,⋯,a n (0≤a i <n) 。 输入数据保证一定能完成任务。

输出

每行输出一个样例的结果

样例输入

3

0 2 0

7

0 3 1 0 5 2 6

样例输出

1

2

代码实现

#include<bits/stdc++.h>
using namespace std;
int main(){ int n,a[1010],aa,res;
bool flag[1010];
while(~scanf("%d",&n)){
for(int i=0;i<n;i++) scanf("%d",&a[i]);
memset(flag,0,sizeof(flag));
aa = 0;
res = 0;
while(aa != n){
for(int i=0;i<n;i++){
if(aa >= a[i] && !flag[i]){
aa++;
flag[i] = true;
}
}
if(aa == n) break;
else res++;
for(int i=n-1;i>=0;i--){
if(aa >= a[i] && !flag[i]){
aa++;
flag[i] = true;
}
}
if(aa == n) break;
else res++;
}
printf("%d\n",res);
}
return 0;
}

1227-Robot

题目描述

假设在一个XOY坐标的平面上,机器人一开始位于原点,面向Y轴正方向。 机器人可以执行向左转,向右转,向后转,前进四个指令。 指令为

•LEFT:向左转

•RIGHT:向右转

•BACK:向后转

•FORWORD n:向前走n(1≤n≤100)个单位

现在给你一个指令序列,求机器人最终的位置。

输入

样例的第一行是一个整数T(T≤20),表示样例的个数。 每个样例的第一行是一个整数N(1≤N≤1,000),表示指令的条数。 以后的N行,每行一条指令。

输出

每个样例输出两个整数,为坐标(x,y),之间用空格隔开。


样例输入

2

4

LEFT

FORWORD 1

RIGHT

FORWORD 1

2

BACK

FORWORD 1

样例输出

-1 1

0 -1

代码实现

#include<bits/stdc++.h>

int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int N;
scanf("%d",&N);
getchar();
int x=0,y=0;
int ix=0,iy=1;
char order[10];
for(int i=0;i<N;i++)
{
scanf("%s",order);
if(order[0]=='L')
{
if(ix==0&&iy==1)
{
ix=-1;
iy=0;
}
else if(ix==-1&&iy==0)
{
ix=0;
iy=-1;
}
else if(ix==0&&iy==-1)
{
ix=1;
iy=0;
}
else if(ix==1&&iy==0)
{
ix=0;
iy=1;
}
}
else if(order[0]=='R')
{
if(ix==0&&iy==1)
{
ix=1;
iy=0;
}
else if(ix==1&&iy==0)
{
ix=0;
iy=-1;
}
else if(ix==0&&iy==-1)
{
ix=-1;
iy=0;
}
else if(ix==-1&&iy==0)
{
ix=0;
iy=1;
}
}
else if(order[0]=='B')
{
if(ix==0&&iy==1)
{
ix=0;
iy=-1;
}
else if(ix==0&&iy==-1)
{
ix=0;
iy=1;
}
else if(ix==1&&iy==0)
{
ix=-1;
iy=0;
}
else if(ix==-1&&iy==0)
{
ix=1;
iy=0;
}
}
else if(order[0]=='F')
{
int num;
scanf("%d",&num);
getchar();
x += num*ix;
y += num*iy;
}
}
printf("%d %d\n",x,y);
}
return 0;
}

1228-Hash

题目描述

平方取中是常用的一种整数Hash函数,对于整数x,计算x*x,然后取数码串的中间4位作为hash值。

 算法如下:

1. s = x*x

2. 如果s位数为奇数,则在之前补0

3. 如果s数码不足4位的,取s,否则取s数码的中间4位组成的10进制整数作为hash值。

现给x,请计算hash(x)。

输入

每行一个正整数x,(x ≤ 109)。

输出

依次输出对应x的hash值。

样例输入

1

10

100

1000

样例输出

1

100

1000

0

代码输入

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
int main(){
__int64 x;
__int64 num[4];
while(~scanf("%I64d",&x)){
__int64 s = x*x;
__int64 ss= s;
//printf("%I64d\n",s);
int digit = 0;
while(ss){
ss /= 10;
digit++;
}
//printf("%d\n",digit);
if(digit&1) digit++;
if(digit<=4) printf("%I64d\n",s);
else {
digit /= 2;
ss = s;
for(int i=0;i<digit-2;i++) ss/=10;
for(int i=0;i<4;i++){
num[i] = ss%10;
ss /= 10;
}
__int64 ans = 0;
for(int i=3,tmp=1000;i>=0;i--,tmp/=10){
ans += num[i]*tmp;
}
printf("%I64d\n",ans);
}
}
return 0;
}

1252-Matrix Word

题目描述

一个n×m 的矩阵,矩阵每个元素是一个小写英文字母,如果某个字母所在行或者列不是唯一的,那么我们就删掉这个字符。

最后,我们按矩阵的从上到下,从左到右,可以得到一个单词。比如,矩阵为

abb

bca

acb

我们可以发现只有第二行的b和a是所在行和列唯一的,所以最后的单词为ba。

输入

存在多个输入样例,每个样例的第一行是两个整数n 和m (1≤n,m≤100) 。

 以后是一个n×m 的矩阵,矩阵每个元素一个小写英文字母。

 输入数据保证结果不为空。

输出

每行输出一个样例的结果。

代码实现

#include<bits/stdc++.h>
char mat[101][101];
int n, m;
bool judge(int i, int j,char c)
{
for(int k = 0; k < m; k++)
if(mat[i][k] == c && k != j) return true;
for(int k = 0; k < n; k++)
if(mat[k][j] == c && k != i) return true;
return false;
}
int main()
{
while(~scanf("%d %d ", &n, &m))
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
mat[i][j]=getchar();
}
getchar();
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(!judge(i, j, mat[i][j])) putchar(mat[i][j]);
}
}
printf("\n");
}
}

1246-Matrix Transposition

题目描述

输入

第一行是一个整数T,(0<T≤10) ,表示样例的数目。

每个样例的第一行是三个整数N,M,K,1≤N,M≤1000,1≤K≤10000 ,分别表示矩阵的行数,列数,非零元素个数。

以后的K行,每行三个整数X,Y,V,0≤X<N,0≤Y<M,−100≤V≤100 ,表示元素的行,列,值。

数据保证输入元素的顺序按行优先有序。

输出

输出每个样例的结果,每个样例输出之后有一个空行。


样例输入

2

3 3 3

0 1 1

1 1 2

1 2 3

1 3 1

0 0 1

样例输出

1 0 1

1 1 2

2 1 3

0 0 1

代码实现

#include<bits/stdc++.h>
using namespace std; struct matrix
{
int col;
int row;
int data;
}mat[10001],res[10001]; void change(struct matrix a[],struct matrix b[],int N,int m)
{
int i,j,t=0;
for(i = 0; i <m; i++)
{
for(j = 0; j <N; j++)
{
if(a[j].col==i)
{
b[t].row = a[j].col;
b[t].col = a[j].row;
b[t].data = a[j].data;
t++;
}
}
}
}
int main()
{
int T,i;
scanf("%d",&T);
while(T--)
{
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
for(i=0; i<k; i++)
{
scanf("%d %d %d",&mat[i].row,&mat[i].col,&mat[i].data);
}
change(mat,res,k,m);
for(i=0; i<k; i++)
{
printf("%d %d %d\n",res[i].row, res[i].col, res[i].data);
}
printf("\n");
}
return 0;
}

Z字形

题目描述

给一个由英文大写字母组成的字符串,串长为n*n(0<n<11),请将这个按Z字形排列输出这个字符方阵。比如: ABCDEFGHI,Z字形排成一个3*3的方阵如下:

A B F

C EG

D H I

输入

每行一个字符串。

输出

输出对应矩阵,每个矩阵之后有一个空行。

Sample Input

ABCDEFGHI

AAAABBBBCCCCDDDD

Sample Output

ABF

CEG

DHI

AABB

ABBD

ACCD

CCDD

代码实现

#include<bits/stdc++.h>
using namespace std; #define N 11
int i,j;
int k;
int ln;
int n;
char s[N*N];
char a[N][N];
void go_right()
{
j++;
}
void go_left()
{
j--;
}
void go_down()
{
i++;
}
void go_up()
{
i--;
};
void left_down()
{
go_left();
go_down();
}
void right_up()
{
go_right();
go_up();
}
void go()
{
while(1)
{
if(j+1 < n)
{
go_right();
a[i][j] = s[k];
k++;//右移
if(k == ln +1) return;
}
else
{
go_down();
a[i][j] = s[k];
k++;
if(k == ln +1) return;
} while(1) //左下移动
{
left_down();
if(j >= 0 && i< n)
{
a[i][j]=s[k];
k++;
if(k == ln +1) return;
}
else break;
}
j++;
i--;//还原一步 if(i+1 < n)
{
go_down();
a[i][j] = s[k];
k++;//向下
if(k == ln +1) return;
}
else
{
go_right();
a[i][j] = s[k];
k++;//右移
if(k == ln +1) return;
} while(1) //右上移动
{
right_up();
if(i>=0 && j<n)
{
a[i][j]=s[k];
k++;
if(k == ln +1) return;
}
else break;
}
i++;
j--;//还原一步
}
}
void print()
{
i=j=0;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
printf("%c",a[i][j]);
printf("\n");
}
}
void Z(char s[])
{
ln = strlen(s);
n = (int)sqrt(ln);
k=0;
i=j=0;
a[i][j] = s[k];
k++;
go();
print();
return;
}
int main()
{
while(scanf("%s",s) != EOF)
{
Z(s);
}
return 0;
}

环形N阶字母矩阵

题目描述

给定 N,输出一个 N*N 的矩阵,矩阵为 N 层,每层是一个字符,从

A 到 Z。比如说 N=3,矩阵为

CCCCC

CBBBC

CBABC

CBBBC

CCCCC

输入

第一行是一个整数 K( K≤ 50),表示样例数。每个样例占 1 行,为一

个整数 N( 1≤ N≤ 26)。

输出

每个样例输出对应的矩阵,行尾没有多余的空格。

代码实现

#include<bits/stdc++.h>

int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int K;
scanf("%d",&K);
char str[2*K-1][2*K-1];
for(int i=0; i<2*K-1; i++)
{
for(int j=0; j<2*K-1; j++)
{
str[i][j]='A'+K-1;
}
}
for(int m=1; m<K; m++)
{
int tt,temp=m;
for(int i=temp,tt=K-1; i<=2*tt-m; i++)
{
for(int j=m; j<=2*tt-m; j++)
{
str[i][j]='A'+K-1-m;
}
}
}
for(int i=0; i<2*K-1; i++)
{
for(int j=0; j<2*K-1; j++)
{
printf("%c",str[i][j]);
}
printf("\n");
}
}
return 0;
}

1238-Binary String

题目描述

求n位01串含连续至少2个1的串的个数。

输入

第一行是一个整数K(K≤10000),表示样例的个数。 每行样例是一个整数n(1≤1000000)。

输出

每行输出一个样例的结果,因为数目可能很大,请对109+7取模。

样例输入

5

1

2

3

4

1000000

样例输出

0

1

3

8

782550144

思路

递推。考虑i位时,设f[i]为结果,那么显然可知,i位是在i-1位的基础上,由最高位加0和加1形成,

加0结果就为f[i-1],加1分两种情况:

  • 一种是i-1位的最高位为0,结果显然是f[i-2];
  • 另一种是最高位为1,那么加1肯定至少有两个1连续,结果必为i-1位二进制总数的一半,即2^(i-2)。

所以得到递推式f[i]=f[i-1]+f[i-2]+2^(i-2)。先预处理一下,然后直接输出即可(节约时间)。

代码实现

#include <bits/stdc++.h>
using namespace std; #define maxn 1000005
#define mod 1000000007
long long f[maxn], dp[maxn];
int n;
void init(){
dp[1] = 1;
for (int i=2; i<maxn; i++)
dp[i] = 2*dp[i-1]%mod;
f[1] = 0;
f[2] = 1;
for (int i=3; i<maxn; i++)
f[i] = (f[i-1]+f[i-2]+dp[i-1])%mod;
}
int main(){
init();
int T;
cin >> T;
while (T--){
cin >> n;
cout << f[n] << endl;
}
return 0;
}

1168-填颜色

题目描述

给你n个方格,m种颜色,要求相邻格和首尾格的颜色不同,请问有多少种不同的填涂方法。

输入

每行输出两个整数n和m,1≤n,m≤1,000。

输出

每行输出一个样例的结果,由于可能会很大,最后结果对1000003取模。


样例输入

1 1

1 2

3 2

1000 10

样例输出

1

2

0

566585

分析

当n<=3时我们要特殊处理一下。

当n>3时,我们发现要考虑的情况有两种:

  • 当倒数第二个格子样式和第一个格子样式相同时。
  • 当倒数第二个格子样式和第一个格子样式不同时。

代码实现

#include <cstdio>
const int MOD = 1000003;
long long f[1111], n, m;
int main() {
while(scanf("%I64d %I64d",&n, &m) != EOF) {
f[1] = m;
f[2] = m * (m-1) % MOD;
f[3] = f[2] * (m-2) % MOD;
for(int i = 4; i <= n; i++) f[i] = (f[i-1] * (m-2) % MOD + f[i-2] * (m-1) % MOD) % MOD;
printf("%I64d\n", f[n]);
}
}

1176-First Blood

题目描述

ICPC比赛中,某道题的第一次正确提交,被称为First Blood。现给你一个提交的日志文件,请计算出所有题目的First Blood情况。

输入

样例的第一行是一个整数N,表示比赛题目的总数(1≤N≤16)。 以后每行是一条日志信息,包含提交的时间,格式为小时:分钟:秒, 提交队伍号,题目的题号(从1001开始),判题结果。 判题结果为“Accepted”为正确提交,其他都为错误提交。如果有多个队伍同时刻正确提交同一道题,以出现在前的队伍为准。

输出按题目顺序,每行输出一个题的First Blood情况,包含题号, First Blood的时间,提交的队伍号。如果没人正确提交,则只需要输出题号。

样例输入

3

00:35:10 Team001 1001 Wrong Answer

00:55:20 Team002 1002 Runtime Error

00:56:21 Team003 1002 Time Limit Error

01:06:22 Team001 1001 Accepted

01:26:56 Team002 1001 Accepted

02:08:10 Team003 1001 Wrong Answer

02:10:33 Team003 1001 Accepted

02:20:10 Team001 1002 Time Limit Error

02:40:20 Team003 1003 Accepted

02:42:52 Team002 1002 Accepted

02:50:35 Team003 1002 Runtime Error

02:51:48 Team003 1002 Accepted

样例输出

1001 01:06:22 Team001

1002 02:42:52 Team002

1003 02:40:20 Team003

代码实现

#include<bits/stdc++.h>
int main()
{
int N,flag[100];
scanf("%d",&N);
getchar();
char _time[10][10],_name[10][10];
char time[10],name[10],res[20];
int num;
char c;
memset(flag,0,sizeof(flag));
while(scanf("%s %s %d %s",time,name,&num,res)!=EOF)
{
while((c=getchar())!='\n')
{
num-=1000;
if(strcmp(res,"Accepted")==0)
{
if(flag[num]==0||strcmp(time,_time[num])<0)
{
flag[num]=1;
strcpy(_name[num],name);
strcpy(_time[num],time);
}
}
}
}
for(int i=1; i<=N; i++)
{
if(flag[i]==0)
printf("%d\n",i+1000);
else
printf("%d %s %s\n",i+1000,_time[i],_name[i]);
}
return 0;
}

119-Balloon2

题目描述

ICPC比赛当你过了一道题以后,会发一个标识这道题颜色的气球。 现给你2个队过的气球的颜色,求他们都过了的气球是哪些?

输入

第一行是一个整数K,表示样例的个数(K≤100)。 每个样例的第一行是两个整数N和M,1≤N,M≤100000,表示两个队分别过题的数量;

第二、三行分别是N和M个有序的整数Xi和Yi,0≤Xi,Yi≤109,表示气球的颜色。 输入数据保证集合{Xi}和{Yi}的元素都是唯一的,

且两个集合一定存在交集。

输出

每个样例输出两行,第一行输出相同的过题数目S,第二行按升序输出S个整数,每个整数之间空一个空格。


样例输入

2

3 3

1 2 3

1 2 3

3 2

1 2 3

2 3

样例输出

3

1 2 3

2

2 3

代码实现

#include<bits/stdc++.h>
using namespace std; int main()
{
int K;
scanf("%d",&K);
int N,M,n[100001],m[100001],res[100001];
while(K--)
{
scanf("%d %d",&N,&M);
for(int i=0; i<N; i++)
{
scanf("%d",&n[i]);
}
for(int j=0; j<M; j++)
{
scanf("%d",&m[j]);
}
sort(n,n+N);
sort(m,m+M);
int i=0,j=0,cnt=0;
while(i<N&&j<M)
{
if(n[i]==m[j])
{
res[cnt]=n[i];
i++;
j++;
cnt++;
}
else if(n[i]>m[j])
{
j++;
}
else
{
i++;
}
}
printf("%d\n",cnt);
sort(res,res+cnt);
for(i=0; i<cnt; i++)
{
printf("%d",res[i]);
if(i<cnt-1) printf(" ");
}
printf("\n");
}
return 0;
}

1193-Eason

题目描述

Eason是个非常迷信的人,他喜欢数字3和6,不喜欢4和7。 如果一个数字的数码中没有4和7,而有3或者6的话,他就会喜欢这个数字。

比如,他会喜欢13,36,但是不会喜欢14,34。但对于28这种的,他就无所谓喜欢还是不喜欢。

Eason想知道区间[a,b]中一共有多少个他喜欢和不喜欢的数字?

输入

每行输入一个样例,为a和b,0≤a≤b≤106。如果a和b都为0,那么输入结束,这个样例不需要处理。

输出

每行输出一个样例的结果,先输出喜欢数字的个数,再输出不喜欢数字的个数。


样例输入

1 10

1 100

1 1000000

0 0

样例输出

2 2

28 36

215488 737856

代码实现

#include<bits/stdc++.h>

using namespace std;
#define N 1000000
int likes[1000010], dlikes[1000010];
int check(int x)
{
int flag = 0;
while(x)
{
int xx = x%10;
x /= 10;
if(xx == 4||xx==7) return 2;
if(xx == 3||xx==6) flag = 1;
}
return flag;
}
int main()
{
int a,b,i;
for(i=1; i<=N; i++)
{
int x = check(i);
if(x == 1) likes[i] = likes[i-1]+1;
else likes[i] = likes[i-1];
if(x == 2) dlikes[i] = dlikes[i-1]+1;
else dlikes[i] = dlikes[i-1];
}
while(~scanf("%d%d",&a,&b))
{
if(a==0 && b==0) break;
int x = check(a);
if(x == 1)
{
printf("%d %d\n",likes[b]-likes[a]+1,dlikes[b]-dlikes[a]);
}
else if(x == 2)
{
printf("%d %d\n",likes[b]-likes[a], dlikes[b]-dlikes[a]+1);
}
else
{
printf("%d %d\n",likes[b]-likes[a],dlikes[b]-dlikes[a]);
}
}
return 0;
}

1214-A+B IV

题目描述

小明喜欢做a+b的算术,但是他经常忘记把末位对齐,再进行加,所以,经常会算错。 比如12+13,他把12左移了1位,结果变成了133。

小明已经算了一些等式,请计算一下他到底移动了多少位。

输入

第一行是一个整数K,表示样例的个数。 以后每行一个样例,形如a+b=c, 1≤a,b≤1e4;0≤c≤1e9。

输出

每行输出一个样例的结果,以b为标准,a如果往左移n位,输出n,如果往右移n位,输出-n。

测试数据保证一定有解,如果存在多个解,输出左移的结果。


样例输入

6

12+13=1213

12+13=1312

12+13=25

12+13=12013

12+13=133

12+13=142

样例输出

2

-2

0

3

1

-1

代码实现

#include<bits/stdc++.h>
using namespace std; int main()
{
int K;
scanf("%d",&K);
while(K--)
{
int a,b,c;
int cnt=0;
int temp;
scanf("%d+%d=%d",&a,&b,&c);
if(a+b==c) printf("0\n");
else
{
//printf("%d\n",temp);
for(temp=1; (b+a*temp!=c)&&(a+b*temp!=c); temp*=10)
{
cnt++;
}
//printf("%d\n",temp);
if((b+a*temp)==c)
printf("%d\n",cnt);
else
printf("-%d\n",cnt);
}
}
return 0;
}

1218-A+B VIII

题目描述

小明一天在做a+b时,突然他想知道a+b能被哪些数整除了?比如说2+4=6,能整除6的数有1,2,3,6,一共4个。

请你帮他算一下,a+b的和能被几个数整除。

输入

第一行是一个整数K,表示样例的个数。 每个样例占一行,为两个整数a,b,(1≤a,b≤1e9)。

输出

每行输出一个样例的结果,为一个整数。


样例输入

2

2 3

4 2

样例输出

2

4

代码实现 / C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int k;
int n,count,i,j,q;
k=1;
scanf("%d %d",&x,&y);
n = x + y;
for (i=2; i*i<=n; i++)
{
if (n%i==0)
{
count = 1;
while (n%i==0)
{
n /= i;
count++;
}
k *= count;
if (n==1) break;
}
}
if (n!=1) k *= 2;
printf("%d\n",k);
}
return 0;
}

代码实现 / JAVA

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int K = in.nextInt();
while ((K--) != 0) {
int i, a, b, cnt = 2, sum;
a = in.nextInt();
b = in.nextInt();
sum = a + b;
for (i = 2; i * i <= sum; i++) {
if (sum % i == 0)
if (i * i == sum)
cnt += 1;
else
cnt += 2;
}
System.out.println(cnt);
}
}
}

1243-Bob's Password

题目描述

Bob最新购入一款安卓手机,他发现安卓手机密码使用的是画线方式。

 一共有9个点,我们按行列顺序依次为1~9。密码要求在点和点之间连线不能有还未曾经过的点。

 比如说:从1出发,可以到2,4,5,6,7,8,但是不能到达3,7,9。

 但是如果从2出发,先到1,这时因为2已经经过了,所以此时可以到达3。

 现在给你一个密码,请问它是否符合密码的这个要求?

输入

第一行是一个整数T(1≤T≤10000),表示样例的个数。

 一个样例占一行,是一个最短为4位,最长9位,只含1-9的字符串,且1-9最多只有1个。

输出

每个样例输出一行,如果合法输出“Yes”,否则输出“No”。

代码实现

#include<bits/stdc++.h>
using namespace std; string fb[] = {"13","31","17","71","19","91","28","82","39","93","37","73","46","64","79","97"};
int main()
{
string s;
int T;
cin >> T;
while(T--)
{
cin >> s;
bool flag = true;
int cnt=0;
for(int i = 0; i < 16; i++)
{
int pos = s.find(fb[i]);//找到相应的下标
if(pos != -1)//找到了在fb中存在的序列
{
cout<<"存在!";
char t = (fb[i][0] + fb[i][1])/2;//找中间点
if(pos<s.find(t))//判断中间点是否在之前的序列中出现过
flag =false;
}
}
if(flag)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}

说明:

  1. 提供的代码不一定是最优解。如有错误,欢迎指正。
  2. 仅供参考,请勿直接复制并提交。若执意如此,导致的后果本人概不负责。

最后!预祝大家程序设计实践全都过!过!过!!!

【一文一图】

程设刷题 | 程序设计实践II-2017(部分)的更多相关文章

  1. 程设刷题 | 编译C++文件出现to_string is not a member of std 或者 to_string was not declared in this scope的解决方法

    写在前面 原文链接:Enabling string conversion functions in MinGW C++在将整型.浮点型.长整型等数据类型转换为字符串时,可使用<string> ...

  2. leetcode刷题-90子集 II

    题目 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2]输出:[ [2], [1], [1,2,2], [ ...

  3. [刷题]Google Code Jam 2017 - Round1 C Problem A. Ample Syrup

    https://code.google.com/codejam/contest/3274486/dashboard Problem The kitchen at the Infinite House ...

  4. [刷题] 454 4Sum II

    要求 给出四个整型数组ABCD,寻找有多少 i j k l 的组合,使得A[i]+B[j]+C[k]+D[l]=0 ABCD元素个数均为N,0<=N<=500 示例 输入: A = [ 1 ...

  5. leecode刷题(6)-- 两个数组的交集II

    leecode刷题(6)-- 两个数组的交集II 两个数组的交集II 描述: 给定两个数组,编写一个函数来计算它们的交集. 示例: 输入: nums1 = [1,2,2,1], nums2 = [2, ...

  6. 好像leeceode题目我的博客太长了,需要重新建立一个. leecode刷题第二个

    376. Wiggle Subsequence               自己没想出来,看了别人的分析. 主要是要分析出升序降序只跟临近的2个决定.虽然直觉上不是这样. 455. 分发饼干     ...

  7. 教你用python写:HDU刷题神器

    声明:本文以学习为目的,请不要影响他人正常判题 HDU刷题神器,早已被前辈们做出来了,不过没有见过用python写的.大一的时候见识了学长写这个,当时还是一脸懵逼,只知道这玩意儿好屌-.时隔一年,决定 ...

  8. NOIp2018停课刷题记录

    Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...

  9. LeetCode刷题记录(python3)

    由于之前对算法题接触不多,因此暂时只做easy和medium难度的题. 看完了<算法(第四版)>后重新开始刷LeetCode了,这次决定按topic来刷题,有一个大致的方向.有些题不止包含 ...

随机推荐

  1. leetcode 201. 数字范围按位与 解题报告

    给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点). 示例 1: 输入: [5,7] 输出: 4 ...

  2. CodeSimth - .Net Framework Data Provider 可能没有安装。解决方法[转载 ]

    原文:http://www.cnblogs.com/chenrui7/p/3592082.html 今天想使用CodeSimth生成一个sqlite数据库的模板.当添加添加数据库的时候发现: .Net ...

  3. 201621123033 《Java程序设计》第1周学习总结

    1. 本周学习总结 · jdk.jre.jvm的含义及相关概念(具体见下文回答) · 会使用记事本及简单编辑器编写Java程序,理解javac和java命令的含义(具体见下文回答) · java与C语 ...

  4. glibc内存泄露以及TCmalloc 简单分析

    最近开发一个私人程序时碰到了严重的内存问题,具体表现为:进程占用的内存会随着访问高峰不断上升,直到发生OOM被kill为止.我们使用valgrind等工具进行检查发现程序并无内存泄露,经过仔细调查我们 ...

  5. 安装JDK以及配置Java运行环境

    安装JDK以及配置Java运行环境 1.JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2 ...

  6. 决策树与随机森林Adaboost算法

    一. 决策树 决策树(Decision Tree)及其变种是另一类将输入空间分成不同的区域,每个区域有独立参数的算法.决策树分类算法是一种基于实例的归纳学习方法,它能从给定的无序的训练样本中,提炼出树 ...

  7. 51nod 1040 最大公约数之和 | 数论

    给出一个n,求1-n这n个数,同n的最大公约数的和 n<=1e9 考虑枚举每个因数,对答案贡献的就是个数*大小

  8. 7月11日day3总结

    今天学习过程和总结 一 1.输出流的字符流.字节流 2.加锁.多线程的理解,产生的原因.cpu同时运行最大数.其他的都在及时切换.1.继承Thred类,重写run方法. 2.实现Runnable接口. ...

  9. 通过CLI命令将ESXi主机进入维护模式

    将主机置于维护模式# vimsh -n -e /hostsvc/maintenance_mode_enter # vim-cmd /hostsvc/maintenance_mode_enter 退出维 ...

  10. placeholer改变默认灰色

    input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{ color:#7b642c; } input:-moz-pl ...