A: 超级水题
一年一度的HNUCM新生赛一般都会有一道超级水题,今年仍不例外。
俗话说:聚沙成塔,积水成渊。
假设第1天有1滴水,第2天有2滴水,第3天有3滴水,以此类推,请问到第N天一共累计有多少滴水?
输入
单组输入。
输入一个正整数N(N<=1000)。
输出
输出到第N天一共累计的水滴数。
样例输入 Copy
4
样例输出 Copy
10
#include <stdio.h>
void solve() {
int n;
long long s = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
s += i;
}
printf("%lld\n", s);
}
int main() {
solve();
return 0;
}
B: hy的整数翻转
hy拿到了一个正整数x ,她希望把这个整数的前 k 位进行翻转。你能帮帮她吗?
输入
第一行输入一个正整数T(1≤T≤1000)。
接下来输入T行,每行包含两个正整数 X 和 k,用空格隔开。
1≤x≤109
k保证不超过x的位数。
输出
翻转后的正整数。请注意不要带前导零。
样例输入 Copy
1 123 2
样例输出 Copy
213
提示
将前两位反转后,12变成了21。正整数变成了213。
#include <stdio.h>
#include <string.h>
char str[1000];
void solve() {
scanf("%s", str);
int n;
scanf("%d", &n);
int flag = 1;
int len = strlen(str);
for (int i = n - 1; i >= 0; i--) {
if (str[i] == '0' && flag) {
continue;
}
else {
flag = 0;
printf("%c",str[i]);
}
}
for (int i = n; i < len; i++) {
printf("%c",str[i]);
}
printf("\n");
}
int main() {
int t;
scanf("%d", &t);
while(t--)
solve();
return 0;
}
C: 奶牛牧场
美丽的含浦有一片奶牛牧场,牧场上的牧草每天都在匀速生长。
已知这片牧场可供N1头奶牛吃D1天,也可以供N2头奶牛吃D2天(D1>D2,N1*D1>N2*D2)。
请问,这片奶牛牧场每天新生的草量可以供几头奶牛吃1天?
输入
单组输入,每组两行。
第1行输入两个正整数N1和D1,均不超过100。
第2行输入两个正整数N2和D2,均不超过100。
已知输入数据满足D1>D2且N1*D1>N2*D2。
输出
计算每天新生草量可以供多少头奶牛吃1天,输出奶牛的头数。
样例输入 Copy
20 15 25 10
样例输出 Copy
10
#include <stdio.h>
void solve() {
int n1, d1, n2, d2;
scanf("%d%d%d%d", &n1, &d1, &n2, &d2);
int s = n1 * d1 - n2 * d2;
printf("%d\n", s / (d1 - d2));
}
int main() {
solve();
return 0;
}
D: GCD
给两个正整数分别为A和B,现在你需要按要求进行以下两种操作。
如果A>=B,A=A−B
如果A<B,B=B−A
问你需要进行几次操作,使A==B。
输入
每个测试包含多个测试用例。第一行包含一个整数 t( 1≤t≤5×105 ) 表示测试用例的数量。
测试用例说明如下,每个测试用例包含两个正整数 a b ( 1≤a,b≤109 )
输出
对于每个测试用例,输出需要操作的次数。
样例输入 Copy
2 10 5 3 3
样例输出 Copy
1 0
#include <stdio.h>
void solve() {
int t;
scanf("%d", &t);
while (t--) {
int a, b;
scanf("%d%d", &a, &b);
if (a < b) {
int temp = a;
a = b;
b = temp;
}
int s = 0;
while (1) {
if (a % b != 0) {
s += a / b;
a %= b;
} else {
s += a / b - 1;
break;
}
int temp = a;
a = b;
b = temp;
}
printf("%d\n", s);
}
}
int main() {
solve();
return 0;
}
E: 孪生花朵
有一种植物会开出N片花瓣的花朵,每一片花瓣的长度都为一个[1, 5]之间的数字。
如果两朵花具有完全相同顺序和长度的N片花瓣,则称它们为孪生花朵。
现在给出两朵花的N片花瓣的长度,请编写一个程序判断它们是不是孪生花朵。
注意:花朵的花瓣会构成一个环。例如:假设两朵花都具有5片花瓣,第1朵花5片花瓣的长度为:1 2 3 4 5,第2朵花5片花瓣的长度为:4 5 1 2 3 ,它们是一对孪生花朵。
输入
单组输入。
第1行输入一个正整数N,表示花瓣的数量,N<=100。
第2行输入N个1-5之间的数字,表示第1朵花每一片花瓣的长度。
第3行输入N个1-5之间的数字,表示第2朵花每一片花瓣的长度。
输出
如果两朵花是一对孪生花朵则输出"Yes",否则输出"No"。
样例输入 Copy
5 1 2 3 4 5 5 4 3 2 1
样例输出 Copy
No
#include <stdio.h>
int a[205],b[205];
void solve() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= n; i++) {
scanf("%d", &b[i]);
b[i + n] = b[i];
}
for (int i = 1; i <= n; i++) {
int f=1;
for (int j = i; j <= i + n - 1; j++) {
if (a[j - i + 1] != b[j]) {
f = 0;
break;
}
}
if (f) {
printf("Yes\n");
return;
}
}
printf("No\n");
}
int main() {
solve();
return 0;
}
F: 存钱能手
Kim打算存钱买一台新电脑(最近目标:华硕 ROG枪神7Plus 超竞版),他决定慢慢养成存钱的好习惯。
第1天他存了1元钱,接下来两天(第2天和第3天)他每天存了2元钱,再接下来三天(第4天、第5天和第6天)他每天存了3元钱,再接下来四天他每天存了4元钱,......,以此类推,请问到第n天时Kimi一共存了多少钱?
输入
单组输入。
输入一个不超过1000的正整数。
输出
输出第n天结束时Kimi存的总钱数(单位:元)。
样例输入 Copy
8
样例输出 Copy
22
#include <stdio.h>
void solve(){
int n;
scanf("%d", &n);
long long s = 0;
int i;
for(i = 0; ;i++){
s += (long long)i * i;
n -= i;
if(n < 0) {
break;
}
}
n += i;
s -= (long long)(i * (i - n));
printf("%lld\n", s);
}
int main(){
solve();
return 0;
}
G: 涂色问题
Kimi这几天在给一堆积木涂色,他遇到一个这样的问题:
现在有一面由n*n个小立方体拼成的墙,每一行有n个小立方体,一共n层。现在Kimi要给这面墙涂满颜色,与地面接触的底面不需要涂色,Kimi想知道有多少个两面涂色的小立方体?
现在给出一个3*3的墙的实例,一共有9个小立方体,给该墙的正面、侧面、背面和顶面涂色后,每个小立方体的涂色面的数量如下所示:
4 3 4
3 2 3
3 2 3
在上面的实例中,我们可以看到两面涂色的小立方体有2个。
现在请你编写一个程序计算在这面墙中两面涂色的小立方体的个数。
输入
单组输入。
输入一个正整数n,n<=100。
输出
输出两面涂色的小立方体的个数。
样例输入 Copy
4
样例输出 Copy
6
#include <stdio.h>
void solve(){
int n;
scanf("%d", &n);
printf("%d\n", (n-1)*(n-2));
}
int main(){
solve();
return 0;
}
H: 翻转扑克牌
有N张扑克牌(3<=N<=100),在初始状态下这N张扑克牌都是背面朝上。每次你可以任意翻转3张扑克牌,背面朝上翻转后会变成正面朝上,正面朝上翻转后会变成背面朝上。
请问最少翻转多少次之后可以将这N张扑克牌全部都翻转为正面朝上。当然,也许不存在一种方案可以将这N张扑克牌全部都翻转为正面朝上。
输入
单组输入。
输入一个正整数N表示扑克牌的数量(3<=N<=100)。
输出
输出一个整数,如果可以将这N张扑克牌全部都翻转为正面朝上,输出最少需要翻转的次数;如果不能够将所有扑克牌全部都翻转为正面朝上则输出-1。
样例输入 Copy
5
样例输出 Copy
3
#include <stdio.h>
void solve(){
int n;
scanf("%d", &n);
if(n == 4) {
printf("4\n");
return;
}
if(n == 7) {
printf("3\n");
return;
}
if(n < 3 || n > 100) {
printf("-1\n");
return;
}
if(n % 3 == 0) {
printf("%d\n", n / 3);
return;
}
if(n % 3 == 1) {
printf("%d\n", 1 + n / 3);
return;
}
if(n % 3 == 2) {
printf("%d\n", (n / 3 - 1) + 3);
return;
}
}
int main() {
solve();
return 0;
}
I: 唯一字符
输入一个长度不超过20的字符串,该字符串仅包含大写字母和小写字母。
请编写一个程序,统计在字符串中只出现一次的字符的个数(注意:区分字母大小写);如果在字符串中不存在只出现一次的字符,则输出"Not Found"。
输入
单组输入。
输入一个长度不超过20,且只包含大写字母和小写字母的字符串。
输出
输出在字符串中只出现一次的字符的个数,如果不存在则输出"Not Found"。
样例输入 Copy
AbbBCcDA
样例输出 Copy
4
#include <stdio.h>
#include <string.h>
#define N 1005
int b[N];
char a[N];
void solve( {
scanf("%s", a);
for (int i = 0; i < strlen(a); i++) {
b[a[i]]++;
}
int s = 0;
for (int i = 0; i < 1000; i++) {
if (b[i] == 1) {
s++;
}
}
if (s != 0) {
printf("%d\n", s);
}
else {
printf("Not Found\n");
}
}
int main() {
solve();
return 0;
}
J: 最萌身高差
N个(3<=N<=1000)X星人站成一行,每个X星人的身高都是一个正整数(范围:100-300,单位:厘米)。
计算相邻两个X星人的身高差(身高差为非负数),其中最大的身高差称为最萌身高差。请编写一个程序输出由N个X星人排成的这一行的最萌身高差。
输入
单组输入。
第1行输入一个正整数N(3<=N<=1000)。
第2行输入N个正整数,分别表示每一个X星人的身高,每一个正整数的范围为[100, 300],两两之间用英文空格隔开。
输出
输出一个非负整数表示这一行X星人的最萌身高差。
样例输入 Copy
5 120 178 156 172 200
样例输出 Copy
58
#include <stdio.h>
#include <stdlib.h>
#define N 1005
int a[N];
void solve() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int m = -1;
for (int i = 0; i < n - 1; i++) {
int d = abs(a[i + 1] - a[i]);
if (d > m) {
m = d;
}
}
printf("%d\n", m);
}
int main() {
solve();
return 0;
}
K: 最大矩形
输入一个只包含0和1的二维整型数组,请编写一个程序计算全部由0组成的最大矩形的大小(即包含的0的个数)。
例如:输入一个如下4行5列二维整型数组,其中包含的全部为0组成的最大矩形的大小为6(对应左下部分两行三列0所组成的矩阵,一共包含6个0)。
11000
10100
000 11
00010输入
单组输入。
第一行输入二维数组的行数M和列数N,M和N均为大于等于1且小于等于1000的正整数。
接下来M行每行包含N个整数(整数为0或者1)。
输出
输出一个整数,表示全部为0组成的最大矩形的大小。
样例输入 Copy
4 5 11000 10100 00011 00010
样例输出 Copy
6
#include <stdio.h>
#define N 2005
int a[N], h[N], l[N], r[N];
void solve() {
int m, n;
scanf("%d%d", &m, &n);
int mx, mn;
for (int i = 1; i <= m; i++) {
l[i] = r[i] = i;
}
int s = 0;
for (int i = 1; i <= m; i++) {
mx = 1;
mn = n;
for (int j = 1; j <= n; j++) {
scanf("%1d", &a[j]);
if (a[j] == 0) {
h[j]++;
}
else {
h[j] = 0;
}
if (a[j] == 1) {
mx = j + 1;
}
if (a[j] == 0) {
l[j] = (l[j] > mx) ? l[j] : mx;
}
else {
l[j] = 1;
}
}
for (int j = n; j > 0; j--) {
if (a[j] == 1) {
mn = j - 1;
}
if (a[j] == 0) {
r[j] = (r[j] < mn) ? r[j] : mn;
} else {
r[j] = n;
}
s = (s > h[j] * (r[j] - l[j] + 1)) ? s : h[j] * (r[j] - l[j] + 1);
}
}
printf("%d\n", s);
}
int main() {
solve();
return 0;
}
L: 回文七进制
自从第一个X星人诞生以来,他们一直使用的是七进制。
小X觉得普通的七进制数没有啥意思,他觉得一个七进制数如果还是一个回文数会比较有意思。
现在请你编写一个程序,将一个十进制正整数转成七进制,如果这个数是一个回文七进制数则输出转换之后的七进制数,否则输出"No interest"。
输入
单组输入。
输入一个十进制正整数N,N不超过10^6。
输出
如果N转成七进制之后是一个回文数,则输出转换之后的七进制数,否则输出"No interest"。
样例输入 Copy
57
样例输出 Copy
111
#include <stdio.h>
#include <string.h>
#define N 1000005
char s[N];
int fun1() {
int n = strlen(s);
for (int i = 0; i < n / 2; i++) {
if (s[i] != s[n - i - 1]) {
return 0;
}
}
return 1;
}
void fun(int n) {
int idx = 0;
while (n) {
s[idx++] = (n % 7) + '0';
n /= 7;
}
s[idx] = '\0';
int len = strlen(s);
for (int i = 0; i < len / 2; i++) {
char t = s[i];
s[i] = s[len - i - 1];
s[len - i - 1] = t;
}
}
void solve() {
int n;
scanf("%d", &n);
fun(n);
if (fun1()) {
printf("%s\n", s);
} else {
printf("No interest\n");
}
}
int main() {
solve();
return 0;
}