哎、、 好水啊 准备敲之前一定要想好思路、、、到快结束的时候思路才对、、而且有个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 没思路。。哎 无力啊 、、、