zoukankan      html  css  js  c++  java
  • EOJ Monthly

    ###2018.10

    A.oxx 的小姐姐们

    oxx 和他的小姐姐(们)躺在图书馆前的大草坪上看星星。

    有强迫症的 oxx 想要使得他的小姐姐们正好躺成一块 n×m 的长方形。

    已知小姐姐的形状是 1×p 的长方形(可以横着或竖着躺)。小姐姐从 1 到 nm 编号总共有 nm 个(如果可以的话,绝对够用)。

    P.S. 小姐姐是 1×p 的是因为她们比较苗条。

    输入

    输入三个整数 nmp (1n,m,p100p 是质数)。

    输出

    如果不行,输出 No

    否则输出 Yes。随后输出 n 行 m 列正整数用空格隔开。同一个小姐姐用相同的数字表示,不同的小姐姐用不同的数字表示。数字应是在 [1nm] 范围内的正整数。同一个数字至多出现 p 次,这 p 次应该在横向连续,或者纵向连续。

    如果有多解输出任意一解。

    样例

    input
    2 3 2
    
    output
    Yes
    2 2 3
    1 1 3
    
    input
    3 3 2
    
    output
    No
    
    input
    3 3 3
    
    output
    Yes
    2 2 2
    1 1 1
    3 3 3
    
    input
    2 3 2
    
    output
    Yes
    6 3 3
    6 4 4
    
    input
    4 2 2
    
    output
    Yes
    2 7
    2 7
    5 5
    3 3
    

    提示

    请注意对于最后一组样例输出:

    2 1
    2 1
    1 2
    1 2
    

    是不合法的。因为不同的小姐姐必须用不同的数字表示。你居然把 1 号小姐姐和 2 号小姐姐克隆了 QAQ。

    解题思路:p是质数,如果n*m%p!=0时,显然为"No";否则一定能用多块1*p的矩形覆盖满方阵:考虑先对行进行横线填充,再对行剩下的列进行纵向填充。

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 const int maxn=105;
     5 int n,m,p,t,cnt,tp,mp[maxn][maxn];
     6 int main(){
     7     while(cin>>n>>m>>p){
     8         t=n*m;
     9         if(t%p)cout<<"No"<<endl;
    10         else{
    11             memset(mp,0,sizeof(mp));cnt=1;
    12             cout<<"Yes"<<endl;
    13             for(int x=1;x<=n;++x){///先对行进行填充
    14                 for(int y=1;y<=m-m%p;++y){
    15                     mp[x][y]=cnt;
    16                     if(y%p==0)cnt++;///填满一块1*p的矩形
    17                 }
    18             }
    19             for(int y=m-m%p+1;y<=m;++y){///再对剩余的列进行填充
    20                 for(int x=1;x<=n-n%p;++x){
    21                     mp[x][y]=cnt;
    22                     if(x%p==0)cnt++;
    23                 }
    24             }
    25             for(int i=1;i<=n;++i)
    26                 for(int j=1;j<=m;++j)
    27                     cout<<mp[i][j]<<(j==m?'
    ':' ');
    28         }
    29     }
    30     return 0;
    31 }

     ###2018.11

    B.转机折扣

    你女朋友最近又不理你了。这一定是因为你上个月没有去浦东看她。异地恋实在是太辛苦了,浦西到浦东的距离,对于你来说,就像是上海到北京的距离。

    曾有诗这样写道:

    世上最遥远的距离,不是生与死的距离,不是天各一方,而是我就站在你面前,你却不知道我爱你。

    你决定乘坐航班从虹桥飞往浦东,希望能挽回你女朋友的心。

    众所周知,虹桥没有直飞浦东的航班,你需要找一个机场转机。虽然你不在乎这个经济成本,但是,幸运的是,为了庆祝双十一,航空公司推出了一个活动,若你从机场 A 乘坐航班飞往机场 B,机场 B 接着飞往机场 C,且机场 B 的字典序在机场 A 和机场 C 之间的,可以享受 9 折优惠。

    所有机场的名字长度都是相等的。

    一句话题意:给出等长的两个字符串 s 和 t,要求一个与他们等长的字符串字典序比其中一个大,但比另外一个小。

    输入

    输入两行两个等长的非空字符串 st。长度不超过 105,由英文大写字母组成。

    输入保证有解。

    输出

    输出一个与输入的字符串等长的字符串,也由英文大写字母组成。如果有多解,输出任意一解。

    样例

    input
    SHA
    PVG
    
    output
    PZI
    
    input
    ZSPD
    ZSSS
    
    output
    ZSQD
    解题思路:将两个字符串看成两个数来处理,较小的数加1即可。注意末尾的字符如果是'Z',则先变成'A',并且向前进位1,否则直接加1即可(题目保证一定有解),加完直接break。
    AC代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 const int maxn=1e5+5;
     5 char s1[maxn],s2[maxn];
     6 int main(){
     7     while(~scanf("%s%s",s1,s2)){
     8         if(strcmp(s1,s2)>0)swap(s1,s2);
     9         for(int i=strlen(s1)-1;i>=0;--i){
    10             if(s1[i]=='Z')s1[i]='A';
    11             else {s1[i]++;break;}
    12         }
    13         printf("%s
    ",s1);
    14     }
    15     return 0;
    16 }
    
    
  • 相关阅读:
    Java 中的数组操作
    WinForm 无边框窗体、后台创建控件、timer控件
    WinForm 进程与线程
    WinForm messageboxbuttons 和 三级联动
    WinForm ListView控件属性及用法
    WinForm 多窗体、菜单和工具栏控件
    WinForm 小练习订餐界面
    WinForm 公共控件及其常用属性
    WinForm 常用属性及控件
    ADO.NET 数据访问类查询、属性扩展
  • 原文地址:https://www.cnblogs.com/acgoto/p/9967031.html
Copyright © 2011-2022 走看看