目录
注意;1到6是按难度排序的正常题目(也可能不正常吧),7和8是算法题,第7题要用到最小生成树和并查集,第8题要用到
1.题目:外汇
输入:
4
5 7 0 3
2 2
4 3
5 2
输出:
5
输入:
10
32 6 46 9 37 8 33 14 31 5
5 5
3 1
4 3
2 2
3 2
3 2
4 4
3 3
3 1
输出:
45
也是简简单单的好吧
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
long long a[N],b[N],c[N];
int main(){
long long k=0,n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<n;i++)
cin>>b[i]>>c[i];
for(int i=1;i<n;i++){
if(a[i]>=b[i])
{
a[i+1]+=(a[i]/b[i])*c[i];
}
}
printf("%lld\n",a[n]);
return 0;
}
2.题目:高桥迷路了
输入:
6 7 5
LULDR
#######
#...#.#
##...##
#.#...#
#...#.#
#######
输出:
2
输入:
13 16 9
ULURDLURD
################
##..##.#..####.#
###.#..#.....#.#
#..##..#####.###
#...#..#......##
###.##.#..#....#
##.#####....##.#
###.###.#.#.#..#
######.....##..#
#...#.#.######.#
##..###..#..#.##
#...#.#.#...#..#
################
输出:
6
直接遍历,注意x1,y1那里是累加,不是回溯的那种搜索。写给自己看的(错的地方)。
#include<bits/stdc++.h>
using namespace std;
int n,m,t;
char a[505];
char b[505][505];
int c[505];
int ans;
int dx[6]= {0,0,0,1,-1}; //行
int dy[6]= {0,1,-1,0,0}; //列 R L D U
int main() {
cin>>n>>m>>t;
for(int i=1; i<=t; i++) { //输入他要走的方向
cin>>a[i];
if(a[i]=='R')c[i]=1;
else if(a[i]=='L')c[i]=2;
else if(a[i]=='D')c[i]=3;
else c[i]=4;
}
for(int i=1; i<=n; i++) { //输入地图
for(int j=1; j<=m; j++)
cin>>b[i][j];
}
for(int i=2; i<=n-1; i++) { //因为地图周边但是还,所以直接从2开始,到n-1,m-1结束
for(int j=2; j<=m-1; j++) {
if(b[i][j]=='#')continue; //该地是海,直接跳过
int x1=i,y1=j;
for(int v=1; v<=t; v++) {
x1+=dx[c[v]];
y1+=dy[c[v]];
if(b[x1][y1]=='#')
break;
if(v==t) {
ans++;
// printf("%d %d\n",i,j); //验证,用来判断起点是不是题目给出的正确起点
}
}
}
}
printf("%d\n",ans);
return 0;
}
3.题目:和美丽的列阵
输入:
5
3
2 1 3
3
69 69 69
5
100 54 80 43 90
4
3 4 3 3
2
2 1
输出:
2
0
57
1
1
直接最大值减去最小值就好了,跳过中间步骤,省时间。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
struct node { //结构体的使用
int x;
int y;
} q[N];
int a[N],fa[N];
int n=1,m;
int main() {
cin>>n;
while(n--) {
cin>>m;
for(int i=1; i<=m; i++)
cin>>a[i];
sort(a+1,a+1+m); //头文件的使用,快速排序
printf("%d\n",a[m]-a[1]);
}
return 0;
}
4.题目:萨沙和绘画
输入:
7
3 4
3 3
3 10
3 9
4 7
7 11
2 3
输出:
2
2
6
5
4
6
2
这规律真难找!!!
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
long long a[N],b[N],c[N];
int main() {
int t;
cin>>t;
while(t--) {
int n,m,k;
cin>>n>>m;
if(m<=4*n-4)
printf("%d\n",(m+1)/2);
else if(m==4*n-3)
printf("%d\n",2*n-1);
else
printf("%d\n",2*n);
}
return 0;
}
5.题目:萨沙和赌场
输入:
9
2 1 7
2 1 1
2 3 15
3 3 6
4 4 5
5 4 7
4 88 1000000000
25 69 231
13 97 18806
输出:
YES
NO
YES
NO
NO
YES
NO
NO
NO
6.题目:只有两个中的一个
输入:
2 3 5
输出:
9
输入:
1 2 3
输入:
5
输入:
100000000 99999999 10000000000
输入:
500000002500000000
7.题目:村村通
输入:
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
输出:
1
0
2
998
说来惭愧,这题我居然卡了一个小时!
#include<bits/stdc++.h>
using namespace std;
const int N = 1e7 + 10;
struct node { //结构体的使用
int x;
int y;
} q[N];
int s[N];
int n=1,m;
int find(int x) {
while(s[x]>=0)//当指针不为-1时就会一直向前搜索,直到搜索出根结点
x=s[x];
return x;//返回根结点的下标
}
void bing(int root1,int root2) {
if(root1==root2) {
return ;
} else {
if(root1>root2){
s[root2]+=s[root1];
s[root1]=root2;}
else{
s[root1]+=s[root2];
s[root2]=root1;}
}
}
int main() {
while(n) { //因为n是判断条件,但是又至少要输一次n,所以一开始令n=1,就可以开始执行我们的while循环了
cin>>n;
if(n==0) //等于0,直接结束,拜拜
return 0;
cin>>m; //节省时间,下面的步骤就不用进行了
if(m==0)
printf("%d\n",n-1);
for(int i=1; i<=n; i++) //我的博客有写的,而且有两种并和查,这种的题目就用s[i]=-1的好,还能计数
s[i]=-1;
for(int i=1; i<=m; i++) {
cin>>q[i].x>>q[i].y;
bing(find(q[i].x),find(q[i].y)); //并(注意看并的函数,有讲究的)
}
int ans=0;
for(int i=1; i<=n; i++) {
if(s[i]<0)
ans++;
// printf("%d ",s[i]); //验证
}
printf("%d\n",ans-1); //因为这里至少有一个根节点(就是说,如果都在一颗二叉树中,是不是有一个顶点啊,所以就多于了,要减去)
}
return 0;
}
8.题目:传送门
输入:
4 5
1 2 3
1 3 6
2 3 4
2 4 7
3 4 2
输出:
14