哎、、 好水啊 准备敲之前一定要想好思路、、、到快结束的时候思路才对、、而且有个JR还总cha我、、最后依然一题悲剧、、
A. Shooshuns and Sequence
题意:大水、就是把当前kth位置的数字复制到最后,然后删除第一个数字,求最小操作数能把序列变为所有位置的数字都相同。
思路:开始脑子进水,写模拟。。。然后变换一次check一次、、果断悲剧好久,后来看看发现点端倪,初始位置kth一直到最后如果不是全一样的数字怎么变换都不行,然后在这基础上找到kth前第一个与kth不相同的数字的位置就是最小操作数。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[100010];
int main() {
int i , n , k;
while(~scanf("%d%d",&n,&k)) {
for(i = 1 ; i <= n ; i ++) scanf("%d",&a[i]);
for(i = k ; i <= n ;i ++) {
if(a[i]!=a[k]) break;
}
if(i<n+1)
printf("-1\n");
else{
for(i = k ; i >= 1; i --) {
if(a[i]!=a[k]) {printf("%d\n",i);break;}
}
if(i < 1)
printf("0\n");
}
}
}
B. Cosmic Tables
题意:操作 r num1 num2 , c num2 num2 分别是把矩阵的行列互换,然后g num1 num2 是输出当前矩阵的a[num1][num2]...
思路:脑子进水,开始竟然暴力,不T死就怪了。。。用r[x]和c[y]记录当前x y 在初始数组a上的映射就可以了、、、
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1010][1010];
int r[1010] , c[1010];
int n , m;
int main() {
int k;
while(~scanf("%d%d%d",&n,&m,&k)) {
int i , j;
for(i = 1 ; i <= n ; i ++)
for(j = 1 ; j <= m ; j ++)
scanf("%d",&a[i][j]);
char que[4];
int x , y;
for(i = 1 ; i <= n ; i ++) r[i] = i;
for(i = 1 ; i <= m ; i ++) c[i] = i;
int xx , yy;
while(k --) {
scanf("%s %d %d",que,&x,&y);
if(que[0]=='r') {
xx = r[x];
yy = r[y];
r[x] = yy;
r[y] = xx;
}
else if(que[0]=='c') {
xx = c[x];
yy = c[y];
c[x] = yy;
c[y] = xx;
}
else printf("%d\n",a[r[x]][c[y]]);
}
}
}
其它题,就看了看E 没思路。。哎 无力啊 、、、