目录
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;
}
说明:
- 提供的代码不一定是最优解。如有错误,欢迎指正。
- 仅供参考,请勿直接复制并提交。若执意如此,导致的后果本人概不负责。
最后!预祝大家程序设计实践全都过!过!过!!!
【一文一图】