C-Sprache – tägliche Praxis

[Blue Bridge Cup 2013, Provinz B] Wirf die Münze

 

Hintergrund der Frage

Xiao Ming spielt ein „Münzwurf“-Spiel.

Beschreibung der Frage

Auf dem Tisch liegen mehrere Münzen in einer Reihe angeordnet. Wir verwenden * , um die positive Seite darzustellen, und o , um die negative Seite darzustellen (es ist ein Kleinbuchstabe, keine Null). Zum Beispiel die mögliche Situation ist **oo***oooo, wenn die beiden Münzen auf der linken Seite gleichzeitig umgeworfen werden, wird es zu oooo***oooo. Die Frage von Xiao Ming lautet nun: Wenn der Ausgangszustand und der zu erreichende Zielzustand bekannt sind und jedes Mal nur zwei benachbarte Münzen gleichzeitig geworfen werden können, wie oft muss dann mindestens für eine bestimmte Situation geworfen werden?

Eingabeformat

Zwei Zeilen gleichlanger Zeichenfolgen stellen den Ausgangszustand bzw. den zu erreichenden Zielzustand dar. Die Länge jeder Zeile beträgt weniger als 1000.

Die Daten garantieren, dass es mindestens eine Lösung geben muss, um vom Ausgangszustand zum zu erreichenden Zielzustand zu gelangen.

Ausgabeformat

Eine Ganzzahl, die die minimale Anzahl von Operationsschritten angibt.

Eingabe- und Ausgabebeispiele

Eingabe- und Ausgabebeispiele

Geben Sie #1 ein

**********
o****o****

Ausgabe Nr. 1

5

 Geben Sie #2 ein

*o**o***o***
*o***o**o***

 Ausgabe Nr. 2

1
#include<stdio.h>
#include<string.h>
#include <assert.h>
int main()
{
	char arr[1000] = { 0 }, str[1000] = { 0 }, count = 0;
	scanf("%s%s", &arr, &str);
	assert(strlen(arr)== strlen(str));//断言-判断两个字符串长度是否相等
	int rs = strlen(arr);
	int i = 0;
	while (i < rs)//遍历找不同
	{
		if (arr[i] != str[i])
		{
			arr[i] = (arr[i] == '*' ? 'o' : '*');
			arr[i + 1] = (arr[i + 1] == '*' ? 'o' : '*');
			count++;
		}
		i++;
	}
	printf("%d", count);
	return 0;
}

 [NOIP2006 Popularization Group] Offensichtlich Zufallszahlen

Beschreibung der Frage

Mingming wollte einige Klassenkameraden in der Schule zu einer Fragebogenumfrage einladen. Um die Objektivität des Experiments zu gewährleisten, generierte er zunächst mit einem Computer N zufällige ganze Zahlen zwischen 1 und 1000 (N ≤ 100). Behalten Sie für die wiederholten Zahlen nur eine Zahl bei und entfernen Sie die anderen identischen Nummern. Unterschiedliche Nummern entsprechen unterschiedlichen Studentennummern. Sortieren Sie diese Zahlen dann von klein nach groß und gehen Sie entsprechend der sortierten Reihenfolge zu Ihren Klassenkameraden, um sie zu untersuchen. Bitte helfen Sie Mingming, die Arbeit „Duplikate entfernen“ und „Sortieren“ abzuschließen.

Eingabeformat

Es gibt zwei Eingabezeilen. Die erste Zeile ist eine positive Ganzzahl, die die Anzahl N der generierten Zufallszahlen darstellt.

Zeile 2 enthält N durch Leerzeichen getrennte positive Ganzzahlen, bei denen es sich um die generierten Zufallszahlen handelt.

Ausgabeformat

Die Ausgabe besteht ebenfalls aus zwei Zeilen. Die erste Zeile ist 1 positive Ganzzahl M, die die Anzahl verschiedener Zufallszahlen darstellt.

Die zweite Zeile enthält M durch Leerzeichen getrennte positive ganze Zahlen, bei denen es sich um verschiedene Zufallszahlen handelt, sortiert von klein nach groß.

Eingabe- und Ausgabebeispiele

Geben Sie #1 ein

10
20 40 32 67 40 20 89 300 400 15

Ausgabe Nr. 1

8
15 20 32 40 67 89 300 400
#include<stdio.h>
int main()
{
	int n = 0, str[100] = { 0 }, temp = 0;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &str[i]);
	}
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (str[j + 1] < str[j])
			{
				temp = str[j + 1];
				str[j + 1] = str[j];
				str[j] = temp;
			}
		}
	}
	for (int i = 0; i < n - 1; i++)//n-1是为了防止越界
	{
		//把i+1后边的元素往前覆盖
		if (str[i] == str[i + 1])
		{
			for (int k = i; k < n - 1; k++)
			{
				str[k] = str[k + 1];
			}
			n--;
			i--;
		}
	}
	printf("%d\n", n);
	for (int i = 0; i < n; i++)
	{
		printf("%d ", str[i]);
	}
	return 0;
}

P8835 [Chuanzhi Cup #3 Finale] Teilzeichenfolge

Hintergrund der Frage

disangan233 mag Strings, deshalb möchte disangan333, dass Sie einige Strings finden, die disangan233 mögen.

Beschreibung der Frage

Wir hoffen, dass Sie in Chuanzhis Entwicklungskurs eine Software zur Dokumentenverarbeitung entwickeln.

Ermitteln Sie anhand von T Gruppen von Abfragen und jeweils zwei Zeichenfolgen a und b der Länge n und m, die nur englische Buchstaben enthalten, die Häufigkeit des Vorkommens von a in b. Bei denselben Zeichen wird die Groß-/Kleinschreibung nicht beachtet. Beachten Sie, dass a eine stetige Teilfolge von b ist.

Für alle Daten gilt: T≤100, ∑n≤∑m≤10^3. Die Zeichenfolge besteht nur aus englischen Groß- und Kleinbuchstaben.

Eingabeformat

Geben Sie insgesamt 3T+1 Zeilen ein.

Zeile 1 gibt 1 positive ganze Zahl T ein.

Als nächstes gibt es T Gruppen von Eingängen, jede Gruppe von Eingängen hat insgesamt 3 Zeilen.

Zeile 1 gibt 2 positive ganze Zahlen n, m ein.

Zeile 2 gibt einen String a der Länge n ein.

Zeile 3 gibt eine Zeichenfolge b der Länge m ein.

Ausgabeformat

Es gibt T Ausgabezeilen, und die i-te Zeile gibt 1 Ganzzahl aus, was die Antwort auf die Abfrage i angibt.

Eingabe- und Ausgabebeispiele

Geben Sie #1 ein

5
3 10
ABC
Tschüss
2 10
aa
Aaaaaaaaaaaa
5 5
AbCdE
eDcBa
5 5
abcde
ABCDE
3 10
aba
ABBABABA

Ausgabe Nr. 1

3
9
0
1
4

Lösung eins: 

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int  t = 0, n = 0, m = 0, count = 0;//t小组数,n,m字符串的长度,count计数器
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d%d", &n, &m);
		char* a = (char*)malloc( (n+1) * sizeof(char));//开辟数组a的动态内存空间
		                                               //因为数组类型是字符串要留一个字节放斜杆零,防止越界访问
		if (a == NULL)
		{
			return  1;
		}
		scanf("%s", a);
		char* b = (char*)malloc( (m+1) * sizeof(char));//开辟数组b的动态内存空间
		if (b == NULL)
		{
			return 1;
		}
			scanf("%s", b);
			char* ptr = b;//记录b的首地址
		for (int i = 0; i < n; i++)
		{
			*a = tolower(*a);//统一转换为小写
		}
		for (int i = 0; i < m; i++)
		{
			*b = tolower(*b);
		}
		for (int i = 0; i < m; i++)
		{
			if (strncmp( a ,ptr , n) == 0)  //比较前n个字符相同,count++
			{
				count++;
				ptr + n;                    //指向b的指针向前挪动n位比较下一个
			}
			ptr++;
			if (m - i < n)
			{
				break;
			}
		}
		printf("%d", count);
		free(a);                            //释放动态空间
		a = NULL;
		free(b);
		b = NULL;
	}
	return 0;
}

 Die Laufzeit von Lösung eins kann ablaufen. Sie können Lösung zwei ausprobieren:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 函数用于计算字符串a在字符串b中的出现次数
int JiShu(char* a, char* b) 
{
    int count = 0;
    int lenA = strlen(a);
    int lenB = strlen(b);
    for (int i = 0; i <= lenB - lenA; i++)
    {
        // 忽略大小写比较
        int flag = 1;
        for (int j = 0; j < lenA; j++) 
        {
            if (tolower(a[j]) != tolower(b[i + j]))
            {
                flag = 0;
                break;
            }
        }
        if (flag) 
        {
            count++;
        }
    }

    return count;
}
int main() 
{
    int t;
    scanf("%d", &t);
    for (int i = 0; i < t; i++)
    {
        int n, m;
        scanf("%d %d", &n, &m);

        char a[1001], b[1001];
        scanf("%s", a);
        scanf("%s", b);

        int rs = JiShu(a, b);
        printf("%d\n", rs);
    }
    return 0;
}

 

Guess you like

Origin blog.csdn.net/2301_79201049/article/details/134793604