团体程序设计天梯赛-练习集(L1)

001:Hello World(5 分)(AC)

注意要点:无。

#include
using namespace std;

int main(){
  printf("Hello World!");
  return 0;
}

 

002:打印沙漏(20 分)(AC)

注意要点:

1.这个题麻烦的地方就是数学问题,需要考虑打印的字符和空格的字符。

2.其次是就是奇数偶数的问题,这个一开始我也没有想到。

#include
#include
using namespace std;
int main() {
	int N;
	char c;
	scanf("%d %c" , &N , &c);
	//基本操作:设底边拥有字符数为 x , 先需要求出基本实现需要多少个字符//
	int b =  (int)sqrt(2.0 * (1 + N)) - 1;
	if(b % 2 == 0)	b --;
	int sum = (1 + b) * (1 + b) / 2 - 1;
	//倒三角打印//
	for(int i = b ; i > 0 ; i -= 2){
		for(int j = 0 ; j < (b - i) / 2 ; j ++) {
			printf(" ");
		}
		for(int j = 0 ; j < i ; j ++) {
			printf("%c" , c);
		}
		printf("\n");
	} 
	//正三角打印//
	for(int i = 3 ; i <= b ; i += 2) {
		for(int j = 0 ; j < (b - i) / 2 ; j ++) {
			printf(" ");
		}
		for(int j = 0 ; j < i; j ++) {
			printf("%c" , c);
		}
		printf("\n");
	} 
	//求剩余数// 
	printf("%d" , N - sum);
	return 0;
} 
#include
#include
int main(){
  char a[1001];
  gets(a);
  int b[10]={0};
  for(int i=0;i

 

003:个位数统计(15 分)(AC)

注意要点:无。

#include
#include
int main(){
  char a[1001];
  gets(a);
  int b[10]={0};
  for(int i=0;i

 

004:个位数统计(15 分)(AC)

注意要点:无。

#include
#include
int main(){
  char a[1001];
  gets(a);
  int b[10]={0};
  for(int i=0;i

 

005:考试座位号(15 分)(AC)

注意要点:无。

#include
using namespace std;

struct st{
	char a[15];
	int b ; 
	int c;
}s[1005];

int main() {
	int N , M;
	int d; 
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		scanf("%s %d %d" , s[i].a , &s[i].b , &s[i].c);
	}
	getchar();
	scanf("%d" , &M);
	for(int i = 0 ; i < M ; i ++) {
		scanf("%d" , &d);
		for(int j = 0 ; j < N ; j ++) {
			if(s[j].b == d) {
				printf("%s %d\n" , s[j].a , s[j].c);
			}
		}
	}
	return 0;
} 

 

006:连续因子 (20 分)(AC)

参考,真的不会。

这个思路我反正很难想到。我本来在考虑这样做会不会超时啊,这个while(1)连个变都没有。发现还是我想多了。

特别注意这个地方的i - j + 1.

#include
#include
#include
using namespace std;
typedef long long LL;

int main(){
	LL n;
	scanf("%lld" , &n);
	LL sqr = (LL)sqrt(1.0 * n) , ansI = 0 , ansLen = 0;//ansI为对应的第一个整数,而ansLen最长的连续整数长度//
	for(LL i = 2 ; i <= sqr ; i ++){
		LL temp = 1 , j = i;
		while(1){//从这里开始先尝试从i开始最长的序列是多少// 
			temp *= j;//temp记录每次完后的乘积// 
			if(n % temp != 0)//看看能不能整除,不能的话就退出// 
				break;
			if(j - i + 1 > ansLen){//看看目前的最长的长度是不是超过了这个的最长的长度// 
				ansI = i;//更新一下下标// 
				ansLen = j - i + 1;//ansLen的长度也同样更新// 
			}
			j ++;//j往前移// 
		}
	} 
	if(ansLen == 0){
		printf("1\n%lld" , n);
	}	
	else{
		printf("%lld\n" , ansLen);
		for(LL i = 0 ; i < ansLen ; i ++){
			printf("%lld" , ansI + i);//向后移动// 
			if(i < ansLen - 1){
				printf("*");
			}
		}
	}
	return 0;
}

 

007:念数字(10 分)(AC)

注意要点:无。

#include
#include
using namespace std;
int main() {
	char a[10][5]= {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
	char b[100];
	scanf("%s", b);
	int len = strlen(b);
	//正数负数分开计算//
	//负数// 
	if(b[0] == '-'){
		printf("fu ");
		for(int i = 1 ; i < len ; i ++) {
			if(i == len - 1)
				printf("%s" , a[b[i] - '0']);
			else
				printf("%s " , a[b[i] - '0']);
		}
	}
	//正数// 
	else {
		for(int i = 0 ; i < len ; i ++) {
			if(i == len - 1)
				printf("%s" , a[b[i] - '0']);
			else
				printf("%s " , a[b[i] - '0']);
		}
	}
	return 0;
} 

 

009:N个数求和(20 分)(AC)

注意要点:

分数做的时候都要注意0的问题。分数在操作的时候都是分开分子和分母操作的。

#include
using namespace std;

int suma = 0 , sumb = 1;

int gcd(int a , int b) {
	if(b == 0)	return a;
	else	gcd(b , a % b);
}

int main() {
	int N , a , b , c, d ; 
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		scanf("%d/%d" , &a , &b);
		int c = gcd(sumb , b);
		//最小公倍数// 
		int d = sumb / c * b;
		//分子相加//
		suma = d/ sumb * suma;
		a = d / b * a;
		//分母相乘//
		sumb = d ; 
		suma += a;
		c = gcd(suma , sumb);
		suma = suma / c;
		sumb = sumb / c;
	}
	//负数变成正数//
	
	if(suma < 0){
		printf("-");
		suma *= -1;
	}
	//拆分分数//
	if(suma > sumb) {
		int e = suma / sumb ; 
		suma = suma % sumb ; 
		if(suma == 0) {
			printf("%d" , e);
		}
		else{
			printf("%d %d/%d" , e , suma , sumb);
		}
	} 	
	else {
			if(suma == 0)	printf("0");
			else
				printf("%d/%d" , suma , sumb);
		}
	return 0;
} 

 

011:A-B(20 分)(AC)

注意要点:getline可以放int数组进去。

#include
using namespace std;
int main() {
	string a , b;
	int ch[128] = {0};
	getline(cin , a);
	getline(cin , b);
	for(int i = 0 ; i < b.length() ; i ++) {
		ch[b[i]] = 1; //getline的数值可以直接放入int数组中。//
	}
	for(int i = 0 ; a[i] != '\0' ; i ++) {
		if(ch[a[i]] != 1)
			printf("%c" , a[i]);
	}
	printf("\n");
	return 0;
}

 

012:计算指数(5 分)(AC)

注意要点:0,1,2。

#include
#include
using namespace std;
int main() {
	int N , b = 2;
	scanf("%d" , &N);
	int sum = N;
        //0//
	if(N == 0)
		printf("2^0 = 1");
	//1//
        else if(N == 1)
		printf("2^1 = 2");
	//其他//
        else{
		for(int i = 0 ; i < N - 1 ; i ++) {
			b *= 2;
		}
		printf("2^%d = %d" , sum , b);
	}
	return 0;
}

 

013:计算阶乘和(10 分)(AC)

#include
using namespace std;

int ispow(int N) {
	for(int i = N - 1 ; i >= 1 ; i --) {
		N *= i;
	}
	return N;
}

int main() {
	int N;
	int sum = 0;
	scanf("%d" , &N);
	for(int i = 1 ; i <= N ; i ++) {
		sum += ispow(i);
	}
	printf("%d" , sum);
	return 0;
}

 

015:跟奥巴马一起画方块(15 分)(AC)

注意要点:

1.这个题目需要手动四舍五入。

#include
using namespace std;
int main() {
	int N , n;
	char a ; 
	scanf("%d %c" , &N , &a);
	//手动四舍五入// 
	if(N % 2 == 0)	n = N / 2;
	else n = N / 2 + 1;
	//输出// 
	for(int i = 1 ; i <= n ; i ++) {
		for(int j = 1 ; j <= N  ; j ++) {
			printf("%c" , a);
		}
		printf("\n");
	}
	return 0;
}

 

016:查验身份证 (15 分)(AC)

注意要点:这次比上次写的聪明了,可以直接开一个Z的数组直接判断。

#include
using namespace std;

int M[18] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char Z[15] = {'1' , '0' , 'X' , '9' , '8' , '7' , '6' , '5' , '4' , '3' , '2'}; 

int main(){
	int n;
	bool flag = true;
	char s[20];
	scanf("%d" , &n);
	for(int i = 1 ; i <= n ; i ++){
		getchar();
		int sum = 0;
		scanf("%s" , s);
		for(int i = 0 ; i < 17 ; i ++){
			sum += (s[i] - '0') * M[i];
		}
		if(Z[sum % 11] != s[17]){
			printf("%s\n" , s);
			flag = false;
		}
	}
	if(flag == true){
		printf("All passed");
	}
	return 0;
}

 

017:到底有多二(15 分)(AC)

注意要点:

1.就是注意一下百分数怎么写就行。

2.其次是注意一下先 ÷ 后 × ,万一会爆。这个题倒是没什么。

#include
#include
using namespace std;
int main() {
	char a[55];
	int  is_minus = 0 , len = 0;
	float num2 = 0;
	scanf("%s" , a);
	//求位数// 
	if(a[0] == '-'){
		len = strlen(a) - 1 ;
		is_minus = 1;
	}
	else
		len = strlen(a) ;
	//求2的个数//
	for(int i = 0 ; i < strlen(a) ; i ++) {
		if(a[i] - '0' == 2)
			num2 ++;
	}
	//判断是否是负数//
	if(is_minus == 1) 
		num2 = num2 * 1.5 ; 
	//判断是否是偶数//
	if(a[strlen(a) - 1] % 2 == 0)
		num2 = num2 * 2 ;
	printf("%.2f%%" , num2 * 100 / len); //注意写法。//	
	return 0;
} 

 

020:帅到没朋友(20 分)(AC)

注意要点:

1.注意那个点,几乎题目上的所有信息都会有用。

#include
using namespace std;
int main() {
	//input// 
	int N , n , a , b , c ;
	int count = 0 ;
	int ch[100005] = { 0 };
	int sh[100005] = { 0 };
	scanf("%d" , &N); 
	for(int i = 1 ; i <= N ; i ++) {
		scanf("%d" , &a);
		for(int j = 0 ; j < a ; j ++) {
			scanf("%d" , &b);
			if(a == 1 && ch[b] == 0)	ch[b] = -2;//非常要命的一个点//
			else ch[b] = i ; 
		}
	}
	//mark// 
	scanf("%d" , &n);
	for(int i = 0 ; i < n ; i ++) {
		scanf("%d" , &c);
		if(ch[c] == 0 || ch[c] == -2){
			ch[c] = -1;
			sh[count ++] = c; 
		}
	}
	//output// 
	if(count == 0) {
		printf("No one is handsome");
	}
	else {
		for(int i = 0 ; i < count ; i ++) {
			if(i == count - 1) {
				printf("%05d" , sh[i]);
			}
			else{
				printf("%05d " , sh[i]);
			}
		}
	}
	return 0;
}

 

021:重要的话说三遍(5 分)(AC)

注意要点:无。

#include
using namespace std;
int main() {
  printf("I'm gonna WIN!\nI'm gonna WIN!\nI'm gonna WIN!");
  return 0;
}

 

022:奇偶分家(10 分)(AC)

注意要点:无。

#include
using namespace std;
int main() {
	int n , sum1 = 0 , sum2 = 0;
	int a[1005] = {0};
	scanf("%d" , &n);
	for(int i = 0 ; i < n ; i ++) {
		scanf("%d" , &a[i]);
		if(a[i] % 2 == 0) {
			sum1 ++;
		}
		else {
			sum2 ++;
		}
	}
	printf("%d %d" , sum2 , sum1);
	return 0;
}

 

023:输出GPLT(20 分)(AC)

注意要点:无。

#include
using namespace std;
int main() {
	char a;
	int st[4] = {0} ;
	int min = 10005 , max = -1;
	while(scanf("%c" , &a) == 1) {
		//统计gplt的数值// 
		if(a == 'G' || a == 'g')	st[0] ++;
		if(a == 'P' || a == 'p')	st[1] ++;
		if(a == 'L' || a == 'l')	st[2] ++;
		if(a == 'T' || a == 't')	st[3] ++;
	} 
	//查看哪个数值最少,那个数值最多//
	for(int  i = 0 ; i < 4 ; i ++) {
		if(st[i] < min) {
			min = st[i];
		}
		if(st[i] > max){
			max = st[i];
		}
	}
	//更新st的数值// 
	for(int i = 0 ; i < 4 ; i ++) {
		st[i] -= min ; 
	}
	//输出短板// 
	for(int i = 0 ; i < min ; i ++) {
		printf("GPLT");
	}
	//输出剩余的数值//
	for(int i = 0 ; i < max ; i ++) {
		if(st[0] != 0) {
			printf("G");
			st[0] --;
		} 
		if(st[1] != 0) {
			printf("P");
			st[1] --;
		} 
		if(st[2] != 0) {
			printf("L");
			st[2] --;
		} 
		if(st[3] != 0) {
			printf("T");
			st[3] --;
		} 		
	} 
	return 0;
}


 

024:后天(5 分)

注意要点:无。

#include
using namespace std;
int main() {
	int N;
	scanf("%d" , &N);
	if(N == 6)
		printf("1");
	else if(N == 7)
		printf("2");
	else 
		printf("%d" , N + 2);	
	return 0;
} 

 

026:I Love GPLT(5 分)(AC)

注意要点:最要命的就是这个空格。printf 中可以直接输出空格。

#include
using namespace std;
int main() {
	printf("I\n\ \nL\no\nv\ne\n \nG\nP\nL\nT");	
	return 0;
} 

 

027:出租(20 分)(AC)

注意要点:无。

#include
using namespace std;
int main() {
	int i = 0 , count = 0;
	char a;
	int num[11] = { 0 } , judge[11] = { 0 };
	int phone[12];
	//统计数字// 
	while(scanf("%c" , &a) == 1) {
		num[a - '0'] ++;
		phone[i ++] = (a - '0');
	}
	//统计非0个数 , 录入judge信息// 
	for(int i = 9 ; i >= 0 ; i --) {
		if(num[i] != 0) {
			judge[i] = count ++;
		}
	}
	//输出第一行//
	printf("int[] arr = new int[]{");
	for(int i = 9 ; i >= 0 ; i --){
		if(num[i] != 0) {
			printf("%d" , i);
			count --;
			if(count != 0) printf(",");
		}
	}
	printf("};\n");
	//输出第二行//
	printf("int[] index = new int[]{");
	for(int i = 0 ; i < 11 ; i ++) {
		if(i == 10)
			printf("%d};" , judge[phone[i]]);
		else
			printf("%d," ,judge[phone[i]]);
	}
	return 0; 
}

 

028:判断素数(10 分)(AC)

注意要点:

1.逐渐要学会使用bool类型来判断值。bool数值不受影响,该干嘛干嘛。

#include
#include
using namespace std;

bool isprime(int a) {
	if(a <= 1 )	return false;
	int sqr = (int)sqrt(1.0 * a);
	for(int i = 2 ; i <= sqr ; i ++) {//这个地方注意,已经这个地方已经开过了//
		if(a % i == 0)
			return false;
	}
	return true;
}

int main() {
	int N , a;
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		scanf("%d" , &a);
		if(isprime(a) == 1)
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}

 

029:是不是太胖了(5 分)(AC)

注意要点:无。

#include
using namespace std;
int main() {
	float N;
	scanf("%f" , &N);
	printf("%.1f" , (N - 100) * 1.8);
	return 0;
}

 

030:一帮一 (15 分)(AC)

注意要点:

1.新的技巧,遇到题目的时候不要慌张,冷静分析题目,可以画一画图 + 写伪代码。

#include
using namespace std;
int main() {
	int N;
	char name[10][55];
	int G[55];
	bool judge[55] = { 0 };
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		scanf("%d %s" , &G[i] , name[i]);
		getchar();
	}
	int i = 0 , j = N - 1;
	while(1){
		if(i > j) {
			break;
		}
		//如果两个相同// 
		if(G[i] == G[j] || judge[j] == 1){
			j --;
			continue;
		}
		//不相同且未配对// 
		if(G[i] != G[j] && judge[i] == 0 && judge[j] == 0){
			printf("%s %s\n" , name[i] , name[j]);
			judge[i] = 1;
			judge[j] = 1;
			i ++;
			j = N - 1;
			
			continue;	
		}
	}
	return 0;
} 

 

031:到底是不是太胖了(10 分)(AC)

注意要点:

1.注意这个地方的输入要改成float,尤其是涉及到 % 的时候。

#include
#include
using namespace std;
int main() {
	int N ;
	float a , b;
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		scanf("%f %f" , &a , &b);
		float standard = (a - 100) *0.9;
		//先看哪一个大//
		if(( (b / 2) > standard )&& (b / 2 - standard) >= standard * 0.1){
			printf("You are tai pang le!\n");
		} 
		else if(( (b / 2 ) < standard )&& (standard - b / 2) >= standard * 0.1){
			printf("You are tai shou le!\n");
		}
		else {
			printf("You are wan mei!\n"); 
		}
	}
	return 0;
}

 

032:Left-pad(20 分)(AC)

注意要点:

1.这个 string 数据从0开始。

2.substr(pos , len),pos 的数值是下标 ,len 是截的长度。string.length() 的用法有点像strlen 的用法。

#include
#include
using namespace std;
int main() {
	int N ;
	char a;
	string b;
	scanf("%d %c" , &N , &a);
	getchar();
	getline(cin , b);
	//判断给定的数字和长度的对比大小//
	if(N > b.length()){
		for(int i = 0 ; i < N - b.length() ; i ++) {
			printf("%c" , a);
		}
		cout << b <

 

033:出生年(15 分)(AC)

注意要点:

1.当个数小于3位数的时候,要把0压入集合中。

#include
#include
using namespace std;
set s;
//压入集合中// 
void put_set(int year) {
	int count = 0;
	s.clear();
	while(year != 0) {
		int a = year % 10 ; 
		s.insert(a);
		year = year / 10;
		count ++;
	}
	if(count == 1 || count == 2 || count == 3)
		s.insert(0);
}
//判断个数是否一致// 
int judge(int year , int n) {
	put_set(year);
	if(s.size() == n)
		return 1;
	else return 0;
}

int main() {
	int year , n , age = 0;
	scanf("%d %d" , &year , &n);
	//统计年龄// 
	while(judge(year , n) == 0){
		year ++;
		age ++;
	}
	printf("%d %04d" , age , year);
	return 0;
}

 

034:点赞(20 分)(AC)

注意要点:

1.搜索的时候可以使用 “剪枝”。降低搜索的量。

#include
#include
using namespace std;
int main() {
	int N , a , b , max = -1;
	int s[1005] = { 0 };
	
	scanf("%d" , &N);
	//输入// 
	for(int i = 0 ; i < N ; i ++) {
		scanf("%d" , &a);
		for(int j = 0 ; j < a ; j ++) {
			scanf("%d" , &b);
                        //缩减搜索量//
			if(max < b)
				max = b;
			s[b] ++;
		}
	}
	int max1 = -1;
	int t = -1; 
        //可以直接从max开始搜索//
	for(int i = max ; i >= 1  ; i --) {
		if(max1 < s[i]){
			max1 = s[i];
			t = i;
		}
	}
	printf("%d %d" , t , max1);
	return 0;
}

 

035:L1-035 情人节 (15 分)(AC)

注意要点:

1.scanf 在输入的时候会出现不能输入空格的情况。所以还得改成 string 输入。 

#include
using namespace std;
int main() {
	string s , a , b;
	int num = 0;
	while(cin >> s) {
		if(s[0] == '.')
			break;
		num ++;
		if(num == 2){
			a = s;
		}
		if(num == 14){
			b = s;
		}
	}
	if(num >= 14)
		cout << a <<" and "<< b <<" are inviting you to dinner..."<< endl;
	if(num >=2 && num < 14){
		cout << a <<" is the only one for you..."<< endl;
	}
	if(num < 2){
		cout << "Momo... No one is for you ..." << endl;
	}
	return 0;
} 

 

036:L1-036 A乘以B (5 分)(AC)

注意要点:无。

#include
using namespace std;

int main() {
	int a , b;
	scanf("%d %d" , &a , &b);
	printf("%d" , a * b);
	return 0;
}

 

037: A除以B(10 分)(AC)

注意要点:无。

#include
int main()
{
  int A,B;
  float C;
  scanf("%d%d",&A,&B);
  if(A>=-100&&A<=100&&B>=-100&&B<=100)
  {C=(float)A/B;  
    if(B>0)
    printf("%d/%d=%.2f\n",A,B,C);
    else
	    if(B<0)
		 printf("%d/(%d)=%.2f\n",A,B,C);
        else
		printf("%d/0=Error\n",A);}
}

 

038:新世界(5 分)(AC)

注意要点:无。

#include
using namespace std;
int main() {
	printf("Hello World\nHello New World");
	return 0;
}

 

039:古风排版 (20 分)(AC)

注意要点:

1.这个题目唯一可以注意的地方就是关于这个矩阵行列的问题。

#include
#include
using namespace std;
int main() {
	int N;
	string a;
	char s[105][105];
	scanf("%d" , &N);
	getchar();
	getline(cin , a);
	//这个是一个输入的模式// 
	int m = a.size() / N;
	if(a.size() % N != 0)	m ++;
	int k = 0 ;
	for(int i = m - 1 ; i >= 0 ; i --) {
		for(int j = 0; j < N ;j ++) {
			if(k < a.size())
				s[j][i] = a[k ++];
			else
				s[j][i] = ' ';
		}
	}
	for(int i = 0 ; i < N ; i ++) {
		for(int j = 0 ; j < m ;j ++) {
			printf("%c" , s[i][j]);
		}
		printf("\n");
	}
	return 0;
} 

 

040:最佳情侣身高差(10 分)

注意要点:

1.getchar(),这个点注意,一旦有 %c 输入的时候必须小心有 getchar 。

2.注意那种一个做一次输出的题目,记得加回车。

#include
using namespace std;
int main() {
	int N ;
	float b;
	char a;
	scanf("%d" , &N);
	getchar();
	for(int  i = 0 ; i < N ; i ++) {
		scanf("%c %f" , &a , &b);
		getchar();
		if(a == 'M')
			printf("%.2f\n" , b / 1.09);
		else
			printf("%.2f\n" , b * 1.09);
	}
	return 0;
}

 

041:寻找250(10 分)(AC)

注意要点:

1.这个的数字给的太弱了。这个题目是暴力做的,一旦数字超大直接就爆了,建议还是使用无限输入。

#include
using namespace std;
int main() {
	int a , i;
	for(i = 1 ; i < 100000 ; i ++) {
		scanf("%d" , &a);
		if(a == 250)
			break;
	}
	printf("%d" , i);
	return 0;
}

 

042:日期格式化(5 分)(AC)

注意要点:无。

#include
using namespace std;
int main() {
	int a , b , c;
	scanf("%d-%d-%d" , &a , &b , &c);
	printf("%04d-%02d-%02d" , c , a , b);
	return 0;
}

 

044:稳赢(15 分)(AC)

注意要点:

1.注意count 的位置。这个题目的count 的位置就是为了 count = 1 的问题。

#include 
#include
using namespace std;
int main() {
	int N , count = 0;
	char a[15];
	scanf("%d" , &N);
	getchar();
	while(scanf("%s" , a) == 1) {
		//输出End退出// 
		if(strcmp(a , "End") == 0)
			break;
		//先行一步// 
		count++;
		if(count > N){
			if(a[0] == 'C')	printf("ChuiZi\n");
			if(a[0] == 'J')	printf("JianDao\n");
			if(a[0] == 'B')	printf("Bu\n");
			count = 0;
		} 
		else{
			if(a[0] == 'C')	printf("Bu\n");
			if(a[0] == 'J')	printf("ChuiZi\n");
			if(a[0] == 'B')	printf("JianDao\n");
		}
		
	}
	return 0;
}

 

045:宇宙无敌大招呼(5 分)(AC)

注意要点:无。

#include
using namespace std;
int main() {
  char a[10];
  scanf("%s" , a);
  printf("Hello %s" , a);
  return 0;
}

 

046:整除光棍 (20 分)(AC)

注意要点:

1.这个是模拟除法的一个微型例子,其实理解起来不是很难。

#include
using namespace std;
int main() {
	int N , s = 0 ,  n = 0;
	scanf("%d" , &N);
	//先给个初始的数值先计算的//
	while(s < N) {
		s = s * 10 + 1 ;
		n ++;
	}
	//模拟除法// 
	while(1) {
		printf("%d" , s / N);
		s = s % N;
		if(s == 0)	break;
		s = s * 10 + 1 ; 
		n ++;
	}
	printf(" %d\n" , n);
	return 0;
} 

 

047:装睡(10 分)(AC)

注意要点:无。

#include 
using namespace std;
int main() {
	int N;
	char a[10];
	int b , c;
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++){
		scanf("%s %d %d" , a , &b , &c);
		if(b < 15 || b > 20 || c < 50 || c > 70){
			printf("%s\n" , a);
		}
	} 
	return 0;
}

 

048:矩阵A乘以B (15 分)(AC)

注意要点:

1.思路很清晰。注意这个连续求和的环节。

#include
using namespace std;
int main() {
	int n , m;
	int x , y;
	int a[200][200] , b[200][200];
	//输入// 
	scanf("%d %d" , &m , &n);
	for(int i = 0 ; i < m ; i ++) {
		for(int j = 0 ; j < n ; j ++) {
			scanf("%d" , &a[i][j]); 
		}
	}
	scanf("%d %d" , &x , &y);
	for(int i = 0 ; i < x ; i ++) {
		for(int j = 0 ; j < y ; j ++) {
			scanf("%d" , &b[i][j]);
		}
	}
	
	if(n != x) {
		printf("Error: %d != %d" , n , x);
	}
	else{
		printf("%d %d\n" , m , y);
		for(int i = 0 ; i < m ; i ++) {
			for(int j = 0 ; j < y ; j ++) {
				int sum = 0 ; 
                                //这个是一个连续求和的环节。//
				for(int k = 0 ; k < n ; k ++) {
					sum += a[i][k] * b[k][j];
				}
				if(j == y - 1){
					printf("%d\n" , sum);
				}
				else{
					printf("%d " , sum);
				}
				
			}
		}
	}
	return 0;
}

 

049:天梯赛座位分配(20 分)(AC)

注意要点:

1.这个题可以说是20分里面比较麻烦的了。一开始题都看不懂,后来突然想到使用 vector , 但还是卡住了,看了看其他大神的代码才明白这个是什么意思。有点头晕。尤其是第二部分真的很巧妙。这个题目值得二刷。 

#include
#include
using namespace std;

vector s[100];

int main() {
	int N , sum = 0;
	int a[105] ;//每个里面的数字有多少个//
	bool b[105] = { 0 };//标记是否超过了,还访问不访问// 
	//输入// 
	scanf("%d" , &N);
	for(int i = 1 ; i <= N ; i ++) {
		scanf("%d" , &a[i]);
		a[i] *= 10; 
		sum += a[i];
	}
	//把数字分开装//
	int num = 0; 
	int c = 1;
	while(num < N){//?// 
		for(int i = 1 ; i <= N ; i ++) {
			if(s[i].size() < a[i]){
				s[i].push_back(c);
				if(num == N - 1)
					c += 2;//隔位而坐// 
				else
					c ++;
			}
			if(a[i] == s[i].size() && b[i] == 0) {
				num ++;
				b[i] = 1;
			}
		}
	}
	//分开输出//
	for(int i = 1 ; i <= N ; i ++) {
		printf("#%d\n" , i);
		int count = 0 ; 
		for(int j = 0 ; j < s[i].size() ; j ++) {
			count ++;
			if(count % 10 == 0) {
				printf("%d\n" , s[i][j]); 
			}
			else
				printf("%d " , s[i][j]);
		}
	} 
	return 0;
} 

 

050:倒数第N个字符串 (15 分)(AC:vector )

注意要点:倒着输出比较简单啊。

#include
#include
using namespace std;

vector v;

int main(){
	int n , m , sum = 1;
	scanf("%d %d" , &n , &m);
	for(int i = 0 ; i < n ; i ++){//求最大值// 
		sum *= 26;
	}
	m = sum - m;//存正数//
	while(m > 0){//存入vector// 
		v.push_back(m % 26);
		m = m / 26;
	}
	if(v.size() != n){//补齐0// 
		int k = v.size();//记录一下完成之后的v的大小// 
		for(int i = 0 ; i < n - k; i ++){
			v.push_back(0);
		} 
	}
	for(int i = v.size() - 1 ; i >= 0 ; i --){
		printf("%c" , 'a' + v[i]);
	} 
	return 0;
}

 

051:打折(5 分)(AC)

注意要点:无。

#include 
using namespace std;
int main() {
	float a;
	int b;
	scanf("%f %d" , &a , &b);
	printf("%.2f" , a * b * 0.1);
	return 0;
}

 

052:2018我们要赢(5 分)(AC)

注意要点:无。

#include
using namespace std;

int main(){
  printf("2018\nwo3 men2 yao4 ying2 !");
  return 0;
}

 

053: 电子汪(10 分)(AC)

注意要点:无。

#include
using namespace std;
int main() {
	int a , b;
	scanf("%d %d" , &a , &b);
	for(int i = 0 ; i < a + b ; i ++) {
		printf("Wang!");
	}
	return 0;
} 

 

055:谁是赢家(10 分)(AC)

注意要点:无。

#include
using namespace std;
int main() {
	int a , b , c , d , e ;
	scanf("%d %d" , &a , &b);
	scanf("%d %d %d" , &c , &d , &e);
	int sum = c + d + e;
	//甲胜利条件// 
	if(a > b && sum <= 2)
		printf("The winner is a: %d + %d" , a , 3 - sum);
	else if(a < b && sum == 0) 
		printf("The winner is a: %d + %d" , a , 3);
	//乙胜利条件// 
	else if(a < b && sum >= 1)
		printf("The winner is b: %d + %d" , b , sum);
	else if(a > b && sum == 3)
		printf("The winner is b: %d + %d" , b , 3);	 
	return 0;
} 

 

你可能感兴趣的:(团体程序设计天梯赛-练习集(L1))