lwy梦境中的斐波那契数列
这道题就是用一个简单的递推思路就ok了
#include <stdio.h>
#include <stdlib.h>]
long long fei(long long n)
{
if (n == 1)
{
return 1;
}
else
{
return fei(n - 1) + n;
}
}
int main()
{
long long n = 0;
scanf("%lld", &n);
long long a=fei(n);
printf("%lld\n", a % 4399);
return 0;
}
皮卡丘的梦幻之旅(easy version)
这道题的思路我看大家都是dfs,但是这个数据很小,我就用了递推(其实是没学dfs),这个递推的时候注意没赋值的数组要给个16,防止死循环
#define max(a,b) (((a) > (b)) ? (a) : (b))
#include <stdio.h>
#include <stdlib.h>
int fei(int n, int*arr)
{
if (n == 0)
{
return 1;
}
else if (n < 0)
{
return 0;
}
return fei(n - arr[5], arr) + fei(n - arr[4], arr) + fei(n - arr[3], arr);
}
int arr[6] = { 0 };
int main()
{
int n, m;
int num = 0;
scanf("%d %d", &n, &m);
for (int i = 3; i <= m+2; i++)
{
scanf("%d", &arr[i]);
}
if (arr[5] == 0)
{
arr[5] = 16;
}
if (arr[4] == 0)
{
arr[4] = 16;
}
num = fei(n, arr);
printf("%d\n", num);
return 0;
}
你还会想起这道题吗
这道题也是主打一个无脑相加就行了,记住加了之后的数组元素赋值一个0,防止多加了
#include <stdio.h>
#include <stdlib.h>
int arr[55][55] = { 0 };
int main()
{
int n;
int num = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i == 1)
{
num += arr[i][j];
arr[i][j] = 0;
}
if (j == 1)
{
num += arr[i][j];
arr[i][j] = 0;
}
if (i == n)
{
num += arr[i][j];
arr[i][j] = 0;
}
if (j == n)
{
num += arr[i][j];
arr[i][j] = 0;
}
if (j == i)
{
num += arr[i][j];
arr[i][j] = 0;
}
}
}
int mid = n;
for (int i = 1; i <= n; i++)
{
num += arr[i][mid];
arr[i][mid] = 0;
mid--;
}
printf("%d\n", num);
return 0;
}
你还会想起这道题吗(another version)
这道题貌似思路也是很简单,就是麻烦一点,要考虑n是不是偶数(我就一开始踩雷了),然后循环相加存进去另一个数组,最后求出最大值就ac了
#include <stdio.h>
#include <stdlib.h>
int arr[505][505] = { 0 };
int va[505] = { 0 };
int main()
{
int n;
int max = 0;
int num = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%d", &arr[i][j]);
}
}
int s = (n + 1) / 2;
int x, y;
x = s;
y = s;
if (n % 2 == 0)
{
y = y + 1;
}
int b = 1;
while (s--)
{
num = 0;
for (int i = x; i <= y; i++)
{
for (int j = x; j <= y; j++)
{
num += arr[i][j];
arr[i][j] = 0;
}
}
va[b] = num;
b++;
x--;
y++;
}
for (int i = 1; i <= b; i++)
{
if (max < va[i])
{
max = va[i];
}
}
printf("%d\n", max);
return 0;
}
n车摆放问题
其实说个人感受,这道题可能会更加的考一点点小思维,总之也是简单题目,找到n,m的最小值,再使用阶乘算出小的行数怎么放进大的行数就ac了
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
#include <stdio.h>
#include <stdlib.h>
long long suan(long long mid, long long value1)
{
long long num = 1;
for (long long i = 1; i <= mid; i++)
{
num *= i;
}
long long sum = 1;
long long b = mid - value1;
for (long long i = 1; i <= b; i++)
{
sum *= i;
}
return num / sum;
}
int main()
{
long long n, m;
scanf("%lld %lld", &n, &m);
long long value1 = min(n, m);
long long mid = max(n, m);
long long value2 = suan(mid, value1);
printf("%lld\n%lld", value1, value2);
return 0;
}
一道较为复杂的签到题
这道题那么多字其实主打一个程序员会秃头,输出一个0就完事了
轩哥的疑惑
这题竟然是数这场比赛有几道题......
集!挡!波!
这题也就是题目长,其实我们会发现我们完全不会输,从第二回合开始遍历,有j就赢,没有就平局
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char arr[1005] = { 0 };
int main()
{
int n;
int found = 0;
scanf("%d", &n);
scanf("%s", arr);
for (int i = 1; i < n; i++)
{
if (arr[i] == 'J')
{
printf("win");
found = 1;
break;
}
}
if (found == 0)
{
printf("draw");
}
return 0;
}
动物朋友
这道题我没想到用双指针怎么写(菜菜),但是很容易想到了前缀和,但是就单单前缀和的话,时间复杂度会爆掉,所以我尝试着加上了二分,ac了
#define _CRT_SECURE_NO_WARNINGS
#define max(a,b) (((a) > (b)) ? (a) : (b))
#include <stdio.h>
long long arr[1000050] = { 0 };
long long s[1000050] = { 0 };
int main()
{
int n, m;
scanf("%d %d", &n, &m);
int i, j;
int count = 0;
for (i = 1; i <= n; i++)
{
scanf("%lld", &arr[i]);
s[i] = s[i - 1] + arr[i];
}
for (i = n; i >= 1; i--)
{
int left = 0;
int right = i;
while (left <= right)
{
int mid = left + ((right - left) / 2);
if (s[i] - s[mid] > m)
{
left = mid + 1;
}
else if (s[i] - s[mid] < m)
{
right = mid - 1;
}
else
{
count++;
break;
}
}
}
printf("%d\n", count);
return 0;
}
这题用输入的表示一下取模的意思,然后判断两倍关系就好了(按位与的性质)
#include<stdio.h>
#include<stdlib.h>
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
long long a, s;
scanf("%lld %lld", &a, &s);
if (2 * a > s)
{
printf("No\n");
}
else
{
if ((a&(s - a)) == a)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
}
return 0;
}
这道题的直接暴力枚举,记得比k大的时候直接continue,要不然会有错误,因为没必要到那么后
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
int arr[1005000] = { 0 };
int srr[5000005] = { 0 };
int com(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
int main()
{
int n, k;
scanf("%d %d", &n, &k);
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
qsort(arr, n, sizeof(arr[0]), com);
for (int i = 0; i < n; i++)
{
if (arr[i] > k+1)
{
continue;
}
srr[arr[i]]++;
}
int va = k;
for (int i = 0; i < n; i++)
{
if (srr[i] == 0)
{
printf("%d\n", i);
break;
}
if (srr[i] > 0 && va>0)
{
va--;
}
else if (va==0)
{
printf("%d\n", i);
break;
}
}
return 0;
}
这道题主打一个先qsort排序加上前缀和轻松解决
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
long long arr[100505] = { 0 };
int com(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
int main()
{
long long num = 0;//用来输出
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%lld", &arr[i]);
}
int found = 1;
qsort(arr, n+1, sizeof(arr[0]), com);
for (int i = 1; i <= n; i++)
{
if ((num + 1) < arr[i])
{
found = 0;
printf("%lld", num + 1);
break;
}
num += arr[i];
}
if (found == 1)
{
printf("%lld", num + 1);
}
return 0;
}
这道题可以先把总和减去爆发,但是有的爆发不如正常的平a那还是别减了
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
int arr[100505] = { 0 };
int zhong[100505] = { 0 };
int main()
{
int n, h;
int max = 0;
int num = 0;
int sum = 0;
scanf("%d %d", &n, &h);
for (int i = 1; i <= n; i++)
{
int a, b;
scanf("%d", &a);
if (a > max)
{
max = a;
}
scanf("%d", &b);
zhong[i] = b;
}
for (int i = 1; i <= n; i++)
{
if (zhong[i] > max)
{
h = h - zhong[i];
num++;
}
}
if (h % max == 0)
{
num += h / max;
}
else
{
num += h / max;
num = num + 1;
}
printf("%d\n", num);
return 0;
}
建议用一个变量标记一下左右括号的出现,然后就简单了
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
char arr[100050] = { 0 };
int main()
{
int n;
scanf("%d", &n);
scanf("%s", arr);
int pan = 0;
for (int i = 0; i < n; i++)
{
if (arr[i] == '(')
{
pan = 1;
}
if (arr[i] == ',' && pan == 1)
{
arr[i] = '.';
}
if (arr[i] == ')')
{
pan = 0;
}
}
printf("%s", arr);
return 0;
}
水题加签到题
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
int arr[100050] = { 0 };
int main()
{
int n;
scanf("%d", &n);
int max = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &arr[i]);
if (arr[i] % 2 != 0 && max < arr[i])
{
max = arr[i];
}
}
printf("%d\n", max);
return 0;
}
水题加签到题,不过这个判断方法可以积累一下
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
int arr[100050] = { 0 };
int main()
{
int n;
scanf("%d", &n);
int max = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &arr[i]);
if (arr[i] % 2 != 0 && max < arr[i])
{
max = arr[i];
}
}
printf("%d\n", max);
return 0;
}
最后加上一道看起来很难,其实很简单的cf题
Game on a Graph
直接判断边跟点的关系就ac了,后面给的一点用没有....
#include <stdio.h>
#include <stdlib.h>
int num[1000050] = { 0 };
char arr[1000050] = { 0 };
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n;
scanf("%d", &n);
scanf("%s", arr);
for (int i = 0; i < n; i++)
{
num[i] = arr[i] - '0';
}
int x, y;
scanf("%d %d", &x, &y);
for (int i = 1; i <= y; i++)
{
int a, b;
scanf("%d %d", &a, &b);
}
int mid = (y - x + 1) % n;
if (num[mid] == 1)
{
printf("2\n");
}
else
{
printf("1\n");
}
}
return 0;
}
Stones in the Bucket
我们其实只需要将大于平均数的值相加就ac了
#include <stdio.h>
#include <stdlib.h>
int comp(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
long long a[100010] = { 0 };
int main()
{
int t;
scanf("%d", &t);
for (int i = 1; i <= t; i++)
{
long long j;
scanf("%lld", &j);
long long num = 0;
for (int w = 0; w < j; w++)
{
scanf("%lld", &a[w]);
num += a[w];
}
long long ever = num / j;
qsort(a, j, sizeof(a[0]), comp);
long long value = 0;
for (int w = 0; w < j; w++)
{
if (a[w] > ever)
{
value += (a[w] - ever);
}
}
printf("%lld\n", value);
}
return 0;
}