題目鏈接:
暫時擺這三道,後面補完在貼。
A
簡單模擬
#include<stdio.h>
#include<string.h>
const int maxn=1100;
int a[maxn];
int num[maxn];
int main(){
int n;
int mx=-1;
scanf("%d",&n);
memset(num,0,sizeof(num));
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
// num[a[i]]++;
if(mx<a[i]) mx=a[i];
}
num[0]=1;
for(int i=0;i<n-1;i++){
if(a[i]==a[i+1]) num[i+1]=num[i]+1,num[i]=1;
else num[i+1]=1;
}
/*check num[]*/
/*
for(int i=0;i<n;i++){
printf("%d ",num[i]);
}printf("\n");
*/
int number=0;
for(int i=0;i<n;i++){
if(num[i]>1) number++;
}
//*
bool up=true;
bool ans=true;
if(number>1) printf("NO\n");
else{
for(int i=0;i<n-1;i++){
if(a[i]<a[i+1]&&up){
//printf("1\n");
continue;
}else if(a[i]==a[i+1]&&a[i]==mx){
//printf("2\n");
continue;
}else if(a[i]>a[i+1]&&up){
// printf("3\n");
up=false;
}
else if(a[i]>a[i+1]&&!up){
//printf("4\n");
continue;
}
else{
// printf("5\n");
ans=false;
break;
}
}
if(ans) printf("YES\n");
else printf("NO\n");
}
//*/
return 0;
}
B
#include<stdio.h>
#include<ctype.h>
#include<string.h>
const int maxn=1100;
char a[maxn],b[maxn],c[maxn];
int main(){
scanf("%s",a);
scanf("%s",b);
scanf("%s",c);
for(int i=0;i<strlen(c);i++){
if(isalpha(c[i])==0){
printf("%c",c[i]);
}else if(isalpha(c[i])==2){
for(int j=0;j<26;j++){
if(a[j]==c[i]){
printf("%c",b[j]);
break;
}
}
}else if(isalpha(c[i])==1){
char ch=tolower(c[i]);
for(int j=0;j<26;j++){
if(a[j]==ch){
printf("%c",toupper(b[j]));
break;
}
}
}
}
return 0;
}
更簡單的模擬
C題
逆向思維。
一個初始值要滿足所有的n,那麼對於任意一個b[i]全部倒推其所有可能的初始值init[i],答案一定在這裏面,檢查這些init 是否可以推出其他的n-1個分數即可,注意去重
#include<stdio.h>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=2100;
ll a[maxn],b[maxn];
ll pre[maxn];
ll ini[maxn];
ll bn[maxn];
int k,n;
set<ll> ans,init,bset,tmp;
bool bs(ll des){
int l=0,r=n-1;
// int m=(l+r)/2;
while(l<=r){
int m=(l+r)/2;
if(b[m]==des){
// printf("b[%d]=%d\n",m,b[m]);
return true;
}
//return true;
if(b[m]<des){
l=m+1;
}else if(b[m]>des){
r=m-1;
}
}
return false;
}
int main(){
//int k,n;
scanf("%d%d",&k,&n);
for(int i=0;i<k;i++){
scanf("%I64d",&a[i]);
}
for(int i=0;i<n;i++){
scanf("%I64d",&b[i]);
bset.insert(b[i]);
}
// for(int i=0;i<k;i++)printf("%d ",a[i]);puts("");
// for(int i=0;i<n;i++) printf("%d ",b[i]);puts("");
pre[0]=a[0];
for(int i=1;i<k;i++){
pre[i]=pre[i-1]+a[i];
}
//for(int i=0;i<k;i++)printf("%d ",pre[i]);puts("");
for(int i=0;i<k;i++){
ini[i]=b[0]-pre[i];
init.insert(ini[i]);
}
// for(int i=0;i<k;i++) printf("%d ",ini[i]);puts("");
int res=0;
sort(b,b+n);
for(auto it=init.begin();it!=init.end();it++){
ll cur=*it;
int num=0;
// printf("cur=%d\n",cur);
tmp.clear();
for(int j=0;j<k;j++){
//printf("cur+pre[%d]=%d",j,cur+pre[j]);
// if(bset.find(cur+pre[j])!=bset.end()){
if(bs(cur+pre[j])){
tmp.insert(cur+pre[j]);//就是這個地方要去重 WA了5次
if(tmp.size()==n){
// ans.insert(cur);
res++;
// printf("anscur=%d\n",cur);
break;
}
continue;
}
}
}
printf("%d\n",res);
return 0;
}