用来记录那些岁月中模拟的题目,真是cd啊
1.2020年“远光杯”粤澳计算机程序设计大赛网络资格赛 A–Alice的秘密
时间限制:1 S,内存限制:32 MB
题目描述
Alice有一些重要信息,这信息只包括大写字母、小写字母和空格。她想要对这些信息进行记录,但是又不想直接记录原始信息。
她开始查找资料,其中一种方法是将字母进行变换,设定一个变换位置k,则c=k+m,其中m为原始字符,c为变换结果。比如k=2,则A变为C,Y变为A,z变为b。空格转换为’#’。
Alice对k值的设置方法进行了一些改进,由原来固定的k值改进为使用记录的日期变换出k值。具体方法是对日期构成的每一位求和,直到k小于10。比如20020308,对日期构成的每一位求和得到k=2+2+3+8=15,继续求和k=1+5=6,则最终得到k=6。请你帮Alice编写一个程序,利用记录日期将信息转换为加密编码格式。
这个算法要求日期的格式为:yyyymmdd,年份范围应为[1900-2020],月份范围应为[1-12],日根据年和月确定;信息只能是大写字母、小写字母和空格。
输入
多组输入。
每组数据包括2行。第1行是一个日期,长度不大于8;第2行是要加密的信息,长度不大于128。
输出
每组数据输出如下:
如果输入的日期或信息不符合要求,输出 none
否则,输出加密后的信息。
样例输入
20201206
I wrote a program to get a grade A
1234
GMCPC
样例输出
M#avsxi#e#tvskveq#xs#kix#e#kvehi#E
none
模拟源:
#include<bits/stdc++.h>
using namespace std;
#include<map>
const int maxn = 1e6+7;
map<string,int>mp;
int a[maxn];
int b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){
string s,s1;
while(getline(cin,s)){
int flag=1;
memset(a,0,sizeof a);
getline(cin,s1);
if(s.size()!=8) flag=0;
for(int i=0;i<s1.size();i++)
{
if(s1[i]>='a'&&s1[i]<='z'||s1[i]>='A'&&s1[i]<='Z'||s1[i]==' ') continue;
else {
flag=0;
break;
}
}
for(int i=0;i<s.size();i++)
{
a[i]=s[i]-'0';
}
int y=a[0]*1000+a[1]*100+a[2]*10+a[3],m=a[4]*10+a[5],d=a[6]*10+a[7];
if(y%4==0&&y%100!=0||y%400==0) b[2]=29;
else b[2]=28;
if(y<1900||y>2020||m<1||m>12||d<1||d>b[m]) flag=0;
///else flag=0;
if(flag){
int sum=0;
for(int i=0;i<8;i++) sum+=a[i];
while(sum>=10){
int sum1=0;
while(sum/10){
sum1+=sum%10;
sum/=10;
}
sum1+=sum;
sum=sum1;
}
for(int i=0;i<s1.size();i++)
{
int sum2=sum;
if(s1[i]==' ') s1[i]='#';
else if(s1[i]>='a'&&s1[i]<='z'){
if(sum2+s1[i]>'z')
{
sum2=sum2-('z'-s1[i]);
if(sum2%26==0) s1[i]='z';
else s1[i]='a'+sum2%26-1;
}
else s1[i]+=sum;
}
else if(s1[i]>='A'&&s1[i]<='Z'){
if(sum2+s1[i]>'Z')
{
sum2=sum2-('Z'-s1[i]);
if(sum2%26==0) s1[i]='Z';
else s1[i]='A'+sum2%26-1;
}
else s1[i]+=sum2;
}
}
}
if(!flag) cout << "none" << endl;
else cout << s1 << endl;
}
return 0;
}
2.UPC-2020年春混合个人训练 4.26日场 G-背菜谱
时间限制: 1 Sec 内存限制: 128 MB
问题描述
扬州是中国四大菜系之一的淮扬菜系的发源地。中午,跑男们来到扬州菜根香饭店,这是家很有名的老字号,有着正宗的淮扬菜。狮子头不松不紧、蟹粉味很浓,扬州炒饭配料丰富,米粒颗颗饱满,煮干丝入口即化、汤头也很鲜……
不过吃饭前,他们还必须完成一项比赛——背菜谱,每人都有一本饭店的菜谱,在规定的时间看谁记住的菜名多。Angelababy发现菜谱中有的菜名字多一些,有的字少一些,多的菜名难背一点,少的菜名好背一点,根据Angelababy的经验,她能一眼看出背一个菜名需要的时间,以分钟记。
开始背菜谱的时间是yyyy年mm月dd日hh时min分,开始测试的时间是yyyy’年mm’月dd’日hh’时min’分。那么测试之前她最多能背多少个菜名呢?
输入
第一行一个整数n,表示字典中的单词数,n≤5000。
接下来n行,每行一个整数表示背这个单词需要用的时间,以分钟记,小于等于10000。
接下来两行依次是开始背菜谱的时间和开始测试时间。
输出
输出共一行,包含一个整数,测试前最多能背出的菜名数。
样例输入
2
1
1
2007-06-23-11:59
2007-06-23-12:00
样例输出
1
提示
对于100%的数据,1≤n≤5000。
时间给出的格式是:yyyy-mm-dd-hh:min,例如:2007-06-23-02:00,采用24小时制,每天从00:00~23:59,年份从0000到9999。
模拟源:
#include<bits/stdc++.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 1e6+7;
typedef pair<ll,ll> PII;
PII q[maxn];
int n,flag;
char s1[maxn],s2[maxn];
int a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int b[maxn];
int main(){
int ans;
scanf("%d",&n);
for(int i=1;i<=n;i++) cin >> b[i];
sort(b+1,b+1+n);
cin >> s1 >> s2;
int flag1=((s1[11]-'0')*10+(s1[12]-'0'))*60+(s1[14]-'0')*10+(s1[15]-'0');
int flag2=((s2[11]-'0')*10+(s2[12]-'0'))*60+(s2[14]-'0')*10+(s2[15]-'0');
flag=flag2-flag1;
///cout << flag << endl;
flag1=(s1[0]-'0')*1000+(s1[1]-'0')*100+(s1[2]-'0')*10+s1[3]-'0';
flag2=(s2[0]-'0')*1000+(s2[1]-'0')*100+(s2[2]-'0')*10+s2[3]-'0';
if(flag1==flag2){
if(flag1%4==0&&flag1%100!=0||flag1%400==0) a[2]=29;
else a[2]=28;
int flag3=(s1[5]-'0')*10+(s1[6]-'0');
int flag4=(s2[5]-'0')*10+(s2[6]-'0');
if(flag3==flag4){
ans=((s2[8]-'0')*10+(s2[9]-'0')-(s1[8]-'0')*10-(s1[9]-'0'))*60*24+flag;
}
else{
int ans1=a[flag3]-(s1[8]-'0')*10-(s1[9]-'0');
for(int i=(s1[5]-'0')*10+(s1[6]-'0')+1;i<(s2[5]-'0')*10+(s2[6]-'0');i++) ans1+=a[i];
ans=(ans1+(s2[8]-'0')*10+(s2[9]-'0'))*24*60+flag;
}
///cout << ans << endl;
}
else{
if(flag1%4==0&&flag1%100!=0||flag1%400==0) a[2]=29;
else a[2]=28;
int flag3=(s1[5]-'0')*10+(s1[6]-'0');
int flag4=(s2[5]-'0')*10+(s2[6]-'0');
int ans1=a[flag3]-(s1[8]-'0')*10-(s1[9]-'0');
for(int i=(s1[5]-'0')*10+(s1[6]-'0')+1;i<=12;i++) ans1+=a[i];
for(int i=flag1+1;i<flag2;i++)
{
if(i%4==0&&i%100!=0||i%400==0) ans1+=366;
else ans1+=365;
}
for(int i=1;i<(s2[5]-'0')*10+(s2[6]-'0');i++) ans1+=a[i];
ans=(ans1+(s2[8]-'0')*10+(s2[9]-'0'))*24*60+flag;
}
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=b[i];
if(ans<sum)
{
cout << i-1;
break;
}
if(i==n) cout << n;
}
return 0;
}