【HDU】2020暑期杭电多校第7场解题报告(更新中)

1009:Increasing and Decreasing

下面是AC代码:

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)    
#define T int t ;cin >> t;while(t--)
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
inline ll gcd(ll a,ll b){return b == 0? a:gcd(b, a % b);}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
const int maxn = 2e5 + 10;
const int INF = 0x3f3f3f3f;
const double eps = 1e-11;
ll a[maxn] ;
const ll mod = 1e9 + 7;
int main(){
    T{
        memset(a,0,sizeof a) ;
        ll n , x, y ;
        ll b , c ;
        scanf("%lld%lld%lld",&n,&x,&y) ;
        b = n / y ;
        c = n - b * y ;
        if(x+y>n+1||b+1>x&&c||b>x||x==1&&y!=n||y==1&&x!=n){    
            printf("NO\n") ;
            continue ;
        }
        if(x == 1 &&y == n){
            printf("YES\n") ;
            for(int i = n ; i >=1 ; i--){
                if(i!= n) printf(" ") ;
                printf("%d",i) ;
            }
            printf("\n") ;
            continue ;
        }
        else if(y == 1 &&x == n){
            printf("YES\n") ;
            for(int i = 1 ; i <= n ; i++){
                if(i != 1) printf(" ") ;
                printf("%d",i) ;
            }
            printf("\n") ;
            continue ;
        }
        else{
            printf("YES\n") ;
            while(x > b + c) b-- , c += y ;
            if(c == 0){
                  int times = 1 ;
                  while(times <= b){
                      for(int i = times * y ; i > (times - 1) * y ; i--)
                      if(times == b && i == times * y - y + 1 )
                          printf("%d",i) ;
                      else 
                          printf("%d ",i) ;
                      times++ ;
                }
                printf("\n") ;
              }
              else{
                  for(int i = 1 ; i <= x - b - 1 ; i++)
                      printf("%d ",i) ;
                  for(int i = c ; i >= x - b ; i--)
                      printf("%d ",i) ;
                  int times = 1 ;
                  while(times <= b){
                      for(int i = times * y + c ; i > (times - 1) * y + c ; i--)
                          if(times == b && i ==c + times * y - y +1)
                              printf("%d",i) ;
                      else 
                          printf("%d ",i) ;
                      times++ ;
                }
                printf("\n") ;
           }
            
        }
    }
    return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值