浙江省赛真题2018

只做了签到题,菜就是菜,找啥理由;

但失败了总要得到一些教训;

A - Peak

 ZOJ - 4024 

题意:就是给你一个序列让你判断是不是先增加后减少的,签到;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
ll  a[100005];
int main(){
    int t,n;
    scanf("%d",&t);
    while(t--){
    scanf("%d",&n);
    int flag=1;
    int max=-1,maxi;
    for(int i=1;i<=n;i++){
    scanf("%lld",&a[i]);
    if(a[i]>max){
    max=a[i];
    maxi=i;
    }
    }
    if(maxi==n||maxi==1)flag=0;
    for(int i=1;i<maxi;i++){
    if(a[i]>=a[i+1]){
    flag=0;
    break;
    }
    }
    for(int i=maxi+1;i<=n;i++){
    if(a[i-1]<=a[i]){
    flag=0;
    break;
    }
    }
    if(flag)printf("Yes\n");
    else printf("No\n");
    }

    return 0;    
}
View Code

B - King of Karaoke

 ZOJ - 4025 

题意:就是两个数列做个差,取个众数;我用map做的取众数;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
const int N=1e5+5;
int d[N],s[N],ans[N];
int main(){
    int t,n;
    scanf("%d",&t);
    while(t--){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&d[i]);
    map<int,int>mp;
    for(int i=1;i<=n;i++){
    scanf("%d",&s[i]);
    ans[i]=s[i]-d[i]; 
    mp[ans[i]]++;
    }
    map<int,int>::iterator it;
    int cnt=-1;
    for(it=mp.begin();it!=mp.end();it++){
    if(it->se>cnt)cnt=it->se;
    }
    printf("%d\n",cnt);
    }

    return 0;    
}
View Code

J - CONTINUE...?

 ZOJ - 4033 

题意:就是给你让你构造一个数列,感觉瞎出的题目,怎么构造都可以,这个最开始没有想到,

解法:先判断sum%2是否为1,然后从后往前分配即可;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
int ans[500000];
int main(){
    int n,t;
    scanf("%d",&t);
    while(t--){
    scanf("%d",&n);
    string s;
    cin>>s;
    ll sum=n*1ll*(n+1)/2;
    if(sum%2)printf("-1\n");
    else {
    sum/=2;
    for(int i=n-1;i>=0;i--){
    if(sum>i)sum-=i+1,ans[i]=(s[i]=='1')?4:2;
    else ans[i]=(s[i]=='1')?3:1;
    }
    for(int i=0;i<n;i++)printf("%d",ans[i]);
    printf("\n");
    }
    }
    return 0;    
}
View Code

L - Doki Doki Literature Club

 ZOJ - 4035 

题意:就是排序,我是傻逼,不看数据范围,相乘会爆int,然后就可以过了;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
struct word{string s;ll w;}a[500];
bool cmp(word a,word b){if(a.w!=b.w)return a.w>b.w;else return a.s<b.s;}
int main(){
    int t,n,m;
    scanf("%d",&t);
    while(t--){
    cin>>n>>m; 
    for(int i=1;i<=n;i++)cin>>a[i].s>>a[i].w;
    sort(a+1,a+1+n,cmp);
    ll ans=0;
    for(int i=1;i<=m;i++)ans+=(m-i+1)*a[i].w*1ll;
    printf("%lld ",ans);
    for(int i=1;i<=m;i++){
    cout<<a[i].s;
    if(i==m)printf("\n");
    else printf(" ");
    }
    }

    return 0;    

}
View Code

M - Lucky 7

 ZOJ - 4036 

签到;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
int a[1000];
int main(){
    int t,n,b;
    scanf("%d",&t);
    while(t--){
    scanf("%d%d",&n,&b);
    int flag=0;
    for(int i=1;i<=n;i++){
    scanf("%d",&a[i]);
    if((a[i]+b)%7==0)flag=1;
    }
    if(flag)printf("Yes\n");
    else printf("No\n");
    }

    return 0;    
}
View Code

未完待续;

猜你喜欢

转载自www.cnblogs.com/littlerita/p/12309141.html