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。
不会,待更。(或许不会更)