2 条题解

  • 4
    @ 2022-12-12 19:51:10
    #include <iostream>
    using namespace std;
    int main()
    {
    	long long n, m, s, i, x, r;
    	cin >> n >> m;
    	s = 0;
    	//m次移动
    	for (i = 1; i <= m; i++)
        {
    		cin >> x;
    		s = s + x; 
    	}
    	//去掉完整的若干来回,实际还需要走几个格子
    	s = s % ((n - 1) * 2); 
    	//如果是向右能走完
    	if (s <= n - 1)
        {
    		r = 1 + s;
    	}
        else
        {
    		r = n - s % (n - 1);
    	}
    	cout << r;//输出
    	return 0;
    }
    //代码已AC
    
    • 0
      @ 2022-9-15 20:24:50

      这题重点是不必边算边模拟,而是结束时算一次即可

      //调用啥不用教吧?
      
      inline int reader(){
      	int it = 0 , chr = getchar() ;
      	while('0' > chr || chr > '9')
      		chr = getchar() ;
      	while('0' <= chr && chr <= '9')
      		it = (it << 1) + (it << 3) + chr - '0' , 
              chr = getchar();
      	return it ;
      }//快读
      
      //定义变量不用教吧?
      
      int main(){
      	n = reader() ;
      	m = reader() ;
      	while(m --){
      		mx += reader() ;//一共走了几步
      		mx %= (n << 1) - 2;//原理往下
      	}
      	if(mx < n)
      		printf("%d" , mx + 1) ;
      	else
      		printf("%d" , (n << 1) - 1 - mx) ;
      	return 0;
      }
      

      这题只用输出最后在的位置,以3为例子

      | - -   ||   | - - - (1) 
      - | -   ||   - | - - (2)
      - - |   ||   - - | - (3)
      - | -   ||   - - - | (2)
      =========一组结束=========
      | - -
      - | -
      - - |
      ...........
      

      可以发现,每4个一组 ,往后就又是一个循环 , 算一下即 (n * 2) - 2个为一组,所以多余的可以直接mod掉,防止爆,而最后只要分类讨论是在左还是右就行了

      • 1

      信息

      ID
      540
      时间
      1000ms
      内存
      128MiB
      难度
      5
      标签
      递交数
      71
      已通过
      29
      上传者