目录
1.题目:频率
输入:
frequency
输出:
e
输入:
atcoder
输出:
a
输入:
pseudopseudohypoparathyroidism
输出:
o
思路挺不错的。
#include<stdio.h>
#include<string.h>
char a[20000];
int num[101];
int main() {
gets(a);
int n=strlen(a);
int max=1,k;
for(int i=0; i<n; i++) {
num[a[i]-'a']++;
}
for(int i=0; i<=26; i++)
if(num[i]>max) {
k=i;
max=num[i];
}
k+='a';
if(max>1)
printf("%c",k);
else
printf("%c",a[0]);
return 0;
}
2.题目:剩菜食谱
输入:
2
800 300
100 100
200 10
输出:
5
输入:
2
800 300
100 0
0 10
输出:
38
输入:
2
800 300
801 300
800 301
输出:
0
输入:
10
1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
输出:
222222
主要是思路:
#include<bits/stdc++.h>
using namespace std;
int q[1000001],a[1000001],b[1000001];
int main() {
int n;
cin>>n;
for(int i=1; i<=n; i++)
cin>>q[i];
for(int i=1; i<=n; i++)
cin>>a[i];
for(int i=1; i<=n; i++)
cin>>b[i];
int mi=0x3f3f3f3f; //c++中的最大值,1e9
for(int i=1; i<=n; i++) { //找到第一个菜能做的最大值
if(!a[i])continue; //这里用最小是因为,如果有的菜不够用,就只能选择最小
mi=min(mi,q[i]/a[i]);
}
int ans=0;
for(int k=0; k<=mi; k++) { //从第一个菜的最大值开始
int sum=0x3f3f3f3f;
for(int i=1; i<=n; i++) {
int y=q[i]-a[i]*k;
if(!b[i])continue;
sum=min(sum,y/b[i]); //食材先做了第一个菜剩下的再用来做第二个菜,当然,第一个菜也可以是0,那么就都是剩下的了
}
ans=max(ans,sum+k); //更新最大值
}
cout<<ans<<endl;
return 0;
}
3.题目:我们包罗万象
输入:
4
1 2
2 1
2 2
2 3
输出:
ab
aa
baab
abcbac
他说只要其中正确的一种就可以,直接找规律,套一个正确的呗
#include<bits/stdc++.h> //万能头文件
using namespace std;
int k=0,sb=0,stdo=0;
char num[700];
int vis[28];
int main() {
int t;
cin>>t;
while(t--) {
int n,m;
k=0,sb=0;
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
char a[28];
cin>>n>>m;
for(int i=1; i<=n; i++) {
for(int j=0; j<m; j++) {
char sbwy='a';
printf("%c",sbwy+j);
}
}
printf("\n");
}
return 0;
}
4.题目:平衡的问题集
输入:
3
10 3
5 5
420 69
输出:
2
1
6
分享一位天才的代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int x,n;
scanf("%d%d",&x,&n);
while(x%n!=0)
{
n=(x-1)/(x/n)+1;
}
printf("%d\n",x/n);
}
return 0;
}
然后这是学长的
#include<bits/stdc++.h>
using namespace std;
int main() {
int t;
cin>>t;
while(t--) {
int n,x;
cin>>x>>n;
int ans=1;
for(int i=1; i*i<=x; i++) {
if(x%i)continue;
if(x/i>=n)
ans=max(ans,i);
if(i>=n)
ans=max(ans,x/i);
}
cout<<ans<<endl;
}
return 0;
}
可以自己尝试理解一下,都挺不错的。
5.题目:崴脚王
输入:
5
-4 1
4 4
0 -6
-5 -4
7 -8
输出:
7
8
11
9
15
水
#include<bits/stdc++.h>
using namespace std;
int main() {
int t;
cin>>t;
while(t--) {
int n,m;
cin>>n>>m;
int ma,mi,k=0;
if(abs(n)==abs(m)) {
printf("%d\n",2*abs(n));
continue;
}
ma=max(abs(n),abs(m));
mi=min(abs(n),abs(m));
k+=(ma-mi)*2+mi*2-1;
printf("%d\n",k);
}
return 0;
}
6.题目:网格冰地板
输入:
6 6
######
#....#
#.#..#
#..#.#
#....#
######
输出:
12
输入;
21 25
#########################
#..............###...####
#..............#..#...###
#........###...#...#...##
#........#..#..#........#
#...##...#..#..#...#....#
#..#..#..###...#..#.....#
#..#..#..#..#..###......#
#..####..#..#...........#
#..#..#..###............#
#..#..#.................#
#........##.............#
#.......#..#............#
#..........#....#.......#
#........###...##....#..#
#..........#..#.#...##..#
#.......#..#....#..#.#..#
##.......##.....#....#..#
###.............#....#..#
####.................#..#
#########################
215
这个还是有讲的必要,差不多意思就是找到踩着冰块的最长路径,都是不可以回头,即每个冰块只能踩一次,可以用dfs解决,下面上代码
#include <stdio.h>
#define MAX_R 210
#define MAX_C 210
int dr[5] = { 0, -1, 0, 0, 1 };
int dc[5] = { 0, 0, -1, 1, 0 };
int n,m;
char map[MAX_R][MAX_C];
int searched[MAX_R][MAX_C];
int reachable[MAX_R][MAX_C];
void dfs( int r, int c, int z);
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%s", map[i] + 1);
}
dfs(2, 2, 0);
int cnt = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
cnt += reachable[i][j];
}
}
printf("%d\n", cnt);
return 0;
}
void dfs( int r, int c, int z) {
if (searched[r][c]) {
return;
}
searched[r][c] = 1;
reachable[r][c] = 1;
for (int i= 1; i <= 4; ++i)
{
if (i + z == 5)
{
continue;
}
int x = r, y= c;
while (map[x + dr[i]][y + dc[i]] == '.')
{
x += dr[i];
y += dc[i];
reachable[x][y] = 1;
}
dfs(x, y, i);
}
}