您的位置:首页 > 其它

Noip模拟题解题报告

2018-10-17 11:21 211 查看

Pro

题目链接

Sol

消失的数字

没难度的一道题,去重之后两个判断即可A。

教训:sort之后才能unique

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int n , k , m , a[100005];

int main() {
freopen("del.in","r",stdin);
freopen("del.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
sort(a+1 , a+n+1);
m = unique(a+1 , a+n+1)-a-1;
n = n - m;
if(k<n)
printf("%d",m);
else
printf("%d",n+m-k);
return 0;
}

国际跳棋

大模拟。

一定要注意不要弄错x轴和y轴!还有方向数组,我调了很长很长时间。

#include<iostream>
#include<cstdio>
using namespace std;

int dx[4]={1,-1,-1,1} , dy[4]={1,1,-1,-1};
int ans , map[15][15] , king[15][15] , top , rx[105] , ry[105] , die[15][15];
inline int mymax(int a , int b) { return a>b?a:b; }

void dfs1(int x , int y , int num , int px , int py) {
if(num>=ans) {
if(num>ans) {
ans = num;
top = 0;
}
rx[++top] = px;
ry[top] = py;
}
for(int tx=x+1,ty=y+1;tx<=10&&ty<=10;tx++,ty++) {
if(!die[tx][ty]&&map[tx][ty]==2) {
for(int sx=tx+1,sy=ty+1;sx<=10&&sy<=10;sx++,sy++) {
if(!map[sx][sy]) {
die[tx][ty] = 1;
dfs1(sx , sy , num+1 , px , py);
die[tx][ty] = 0;
} else
break;
}
}
}
for(int tx=x+1,ty=y-1;tx<=10&&ty>=1;tx++,ty--) {
if(!die[tx][ty]&&map[tx][ty]==2) {
for(int sx=tx+1,sy=ty-1;sx<=10&&sy>=1;sx++,sy--) {
if(!map[sx][sy]) {
die[tx][ty] = 1;
dfs1(sx , sy , num+1 , px , py);
die[tx][ty] = 0;
} else
break;
}
}
}
for(int tx=x-1,ty=y+1;tx>=1&&ty<=10;tx--,ty++) {
if(!die[tx][ty]&&map[tx][ty]==2) {
for(int sx=tx-1,sy=ty+1;sx>=1&&sy<=10;sx--,sy++) {
if(!map[sx][sy]) {
die[tx][ty] = 1;
dfs1(sx , sy , num+1 , px , py);
die[tx][ty] = 0;
} else
break;
}
}
}
for(int tx=x-1,ty=y-1;tx>=1&&ty>=1;tx--,ty--) {
if(!die[tx][ty]&&map[tx][ty]==2) {
for(int sx=tx-1,sy=ty-1;sx>=1&&sy>=1;sx--,sy--) {
if(!map[sx][sy]) {
die[tx][ty] = 1;
dfs1(sx , sy , num+1 , px , py);
die[tx][ty] = 0;
} else
break;
}
}
}
}

void dfs2(int x , int y , int num , int px , int py) {
if(num>=ans) {
if(num>ans) {
ans = num;
top = 0;
}
rx[++top] = px;
ry[top] = py;
}
for(int i=0; i<4; i++) {
int tx=x+dx[i] , ty=y+dy[i];
if(!die[tx][ty]&&map[tx][ty]==2&&!map[tx+dx[i]][ty+dy[i]]&&tx+dx[i]>=1&&ty+dy[i]>=1&&tx+dx[i]<=10&&ty+dy[i]<=10) {
die[tx][ty] = 1;
dfs2(tx+dx[i] , ty+dy[i] , num+1 , px , py);
die[tx][ty] = 0;
}
}
}

void sol3() {
top = 0;
for(int i=1; i<=10; i++)
for(int j=1; j<=10; j++) {
if(map[i][j]!=1)
continue;
if(king[i][j]) {
for(int k=0; k<4; k++) {
for(int s=1; s<=10; s++) {
int tx=i+s*dx[k] , ty=j+s*dy[k];
if(tx<1||tx>10||ty<1||ty>10||map[tx][ty])
break;
rx[++top] = i;
ry[top] = j;
}
}
} else {
for(int k=1; k<3; k++) {
int tx=i+dx[k] , ty=j+dy[k];
if(tx<1||tx>10||ty<1||ty>10||map[tx][ty])
continue;
rx[++top] = i;
ry[top] = j;
}
}
}
}

int main() {
freopen("chess.in","r",stdin);
freopen("chess.out","w",stdout);
for(int i=1; i<=10; i++) {
string s;
cin>>s;
for(int j=0; j<10; j++)
map[i][j+1] = s[j]-'0';
}
for(int i=1; i<=10; i++) {
string s;
cin>>s;
for(int j=0; j<10; j++)
king[i][j+1] = s[j]-'0';
}
for(int i=1; i<=10; i++)
for(int j=1; j<=10; j++) {
if(map[i][j]!=1)
continue;
if(king[i][j])
dfs1(i , j , 0 , i , j);
else
dfs2(i , j , 0 , i , j);
}
if(!ans)
sol3();
printf("%d\n",top);
for(int i=1; i<=top; i++)
printf("(%d,%d)\n",rx[i],ry[i]);
return 0;
}

天上掉馅饼

期望 + dp。

不会,待更。(或许不会更)

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: