这个题其实并不难,主要是理解题意难,造成了很多人没有解决;而且当时我也没有做出来;
我直接画个图,然后这样就比较容易理解了;
这样图里面有5个点
分别是 1,2,3,4,5;
这是我们看到有红线有蓝线;我们这个游戏的规则就是剪掉其中任意一条线,使下一个人剪的时候,这些人不能连起来;
如果当前这个人剪线的时候,剪完之后,这些人不能连接起来的话,那么这个人所属的阵营就是loser那一方;而他们每个人都很聪明,所以他们总是先剪掉那些蓝线(实际过程中没有红色和蓝色的线);所以我们发现,这样可以剪掉的线就为 line = m-(n-1);因为n个节点的话,最少需要n-1条线;
但是这些可以剪掉的线有很多很多,所以我们得把这个线对这些人取余;
大体思路就是这个样子:
#include <iostream> #include <cstdio> #include <vector> #define boost ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); using namespace std; const int N =1e6+10; char str[N]; int main() { // boost; int t; scanf("%d",&t); while(t--) { vector<int>res1; vector<int>res2; int k,n,m,x,y; scanf("%d",&k); scanf("%s",str); scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%d%d",&x,&y); res1.push_back(x); res2.push_back(y); } int cha =m-n+1; cha = cha %k; if(str[cha]=='1') { printf("2"); puts(""); } else { printf("1"); puts(""); } } return 0; }