A.相邻数对
题目链接:http://118.190.20.162/view.page?gpid=T16
水题,,,
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
vector<int> vt;
int ans=0;
for(int i=0;i<n;i++){
int temp;
scanf("%d",&temp);
for(int j=0;j<vt.size();j++){
if(abs(temp-vt[j])==1){
ans++;
}
}
vt.push_back(temp);
}
printf("%d",ans);
return 0;
}
/*
7
1 2 3 4 5 6 7
6
5
-1 0 2 3 6
2
*/
B.画图
题目链接:http://118.190.20.162/view.page?gpid=T15
和14年3月份的窗口异曲同工,感觉比那个要简单。
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int MAXV=110;
int G[MAXV][MAXV];
int n;
struct Node{
int x1;int y1;
int x2;int y2;
}noset[MAXV];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d%d",&noset[i].x1,&noset[i].y1,&noset[i].x2,&noset[i].y2);
}
memset(G,0,sizeof(G));
for(int i=1;i<=n;i++){
for(int j=noset[i].x1;j<noset[i].x2;j++){
for(int k=noset[i].y1;k<noset[i].y2;k++){
G[j][k]=i;
}
}
}
int ans=0;
for(int i=0;i<MAXV;i++){
for(int j=0;j<MAXV;j++){
if(G[i][j]!=0) ans++;
}
}
printf("%d",ans);
return 0;
}
C.字符串匹配
题目链接:http://118.190.20.162/view.page?gpid=T14
水题,大小写的区分只要判断值是否差32即可解决。
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int main(){
char buf[110];
scanf("%s",buf);
string std(buf);
int t,n;
scanf("%d%d",&t,&n);
vector<string> vs;
for(int i=0;i<n;i++){
scanf("%s",buf);
string s(buf);
vs.push_back(s);
}
for(int i=0;i<n;i++){
for(int j=0;j<vs[i].size();j++){
bool ok=true;
for(int k=0;k<std.length();k++){
if(t){ //区分大小写
if(j+k>=vs[i].size() || vs[i][j+k]!=std[k]){
ok=false;
break;
}
}else{ //不区分
if(j+k>=vs[i].size() || ( vs[i][j+k]!=std[k] && abs(vs[i][j+k]-std[k])!=32 ) ){
ok=false;
break;
}
}
}
if(ok){
printf("%s\n",vs[i].c_str());
break;
}
}
}
return 0;
}
/*
Hello
0
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
*/
D.最优配餐
题目链接:http://118.190.20.162/view.page?gpid=T13
再次遇到BFS题目,这个不是从一个点开始的,要把多个点push进队列,另外不能置这些点为已访问过,因为每个商店的配送时可以路过其它商店。
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXV=1010;
const int ROAD=0;
const int STOP=-1;
int visit[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int n,m,k,d;
ll G[MAXV][MAXV];
ll allneed=0;
struct status{
int x,y;
ll step;
}shop[MAXV*MAXV];
bool visited[MAXV][MAXV];
ll bfs(){
ll ans=0;
queue<status> q;
memset(visited,false,sizeof(visited));
for(int i=0;i<m;i++){
q.push(shop[i]);
}
while(!q.empty()){
status front=q.front();
q.pop();
if(allneed==0) return ans;
if(G[front.x][front.y]>0){
ans+=front.step*G[front.x][front.y];
allneed-=G[front.x][front.y];
G[front.x][front.y]=ROAD;
}else if(G[front.x][front.y]==STOP){ //不能行走不访问
continue;
}
//向四个方向走
for(int i=0;i<4;i++){
status st;
st.x=front.x+visit[i][0];
st.y=front.y+visit[i][1];
if(st.x<=n && st.x>=1 && st.y<=n && st.y>=1 && !visited[st.x][st.y]){
st.step=front.step+1;
visited[st.x][st.y]=true;
q.push(st);
}
}
}
return ans;
}
int main(){
fill(G[0],G[0]+MAXV*MAXV,ROAD);
scanf("%d%d%d%d",&n,&m,&k,&d);
for(int i=0;i<m;i++){
int x,y;
scanf("%d%d",&x,&y);
shop[i].x=x;
shop[i].y=y;
shop[i].step=0;
}
for(int i=0;i<k;i++){
int x,y,num;
scanf("%d%d%d",&x,&y,&num);
G[x][y]+=num;
allneed+=num;
}
for(int i=0;i<d;i++){
int x,y;
scanf("%d%d",&x,&y);
G[x][y]=STOP;
}
printf("%lld",bfs());
return 0;
}
/*
10 2 4 3
1 1
8 8
1 5 1
1 5 1
2 3 3
6 7 2
1 2
2 2
6 8
37
*/
E.拼图
题目链接:http://118.190.20.162/view.page?gpid=T12
再次留下最后这道题,不会,日后补上,ps:发现底下对数据的描述其实可以写些针对小数据的简单算法,得个10分20分的。