第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛

C NEUQ

思路:就是不要忽略那种NEUQNE这种情况,要记得是四个一组四个一组

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxx=1e6+10;
char s[maxx];
int main(){
    int n;
    int sum=0;
    scanf("%d",&n);
    scanf("%s",&s);
    int flag=1;
    for(int i=0;i<n;i++){
        if(flag==1&&s[i]=='N'){

            flag=2;
        }
        if(flag==2&&s[i]=='E'){

            flag=3;
        }
        if(flag==3&&s[i]=='U'){

            flag=4;
        }
        if(flag==4&&s[i]=='Q'){
            sum++;
            flag=1;
        }
    }
    printf("%d\n",n-sum*4);
}
View Code

D 小G的任务

思路:没想到暴力就可以

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int calcu(int n){
    int x=n%10,y=n/10;
    int sum=0;
    int p=n;
    while(p){
        sum+=p%10;
        p/=10;
    }
    return sum;
}
int main(){
    int n;
    scanf("%d",&n);
    long long sum=0;
    for(int i=0;i<=n;i++){
        sum+=calcu(i);
    }
    printf("%lld\n",sum);
}
View Code

G Num

思路:N=A*B+A+B,N=A*(B+1)+B,N+1=(A+1)*(B+1),直接转化求N+1是不是素数,实在是很妙

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
inline bool isprime(long long n) {
    if (n < 2) return false;
    if (n == 2) return true;
    if (n % 2 == 0) return false;
    for (long long i = 3; i <= n / i; i += 2)
        if (n % i == 0) return false;
    return true;
    
}
int main(){
    long long int n;
    scanf("%lld",&n);
    if(isprime(n+1)){
        printf("No\n");
    }else{
        printf("Yes\n");
    }
}
View Code

 H 特征值

思路:其实很容易看出来他的暴力求解的方法,就是需要模拟一下求和进位的过程

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxx=1e6+10;
char s[maxx];
int sum[maxx]={0};
int sp=0;
int main(){
    scanf("%s",&s);
    int length=strlen(s);
    int flag=0;
    for(int i=0;i<length;i++){
        sp+=s[i]-'0';
    }

    for(int i=0;i<length;i++){
        if(i>0){
            sp-=s[length-i]-'0';
        }
      /*  printf("%d\n",i);
        printf("sp:%d  %c\n",sp,s[length-i]);*/
        sum[i]+=sp;
       
     //   printf("%d:%d %d:%d\n",i,sum[i],i+1,sum[i]+1);
    }//其实在下面的这个for循环中已经模拟了1000这种的进位,所以不用多此一举在前面模拟
    for(int i=0;i<1000000;i++){
        if(sum[i]>=10){

            sum[i+1]+=sum[i]/10;
            sum[i]=sum[i]%10;
        }
    }
    for(int i=0;i<1000000;i++){
        if(sum[i]!=0){
            flag=i;
        }
    }
    for(int i=flag;i>=0;i--){
        printf("%d",sum[i]);
    }
}
View Code

 F 第二大数

思路:用滑动窗口去循环维护最大值和次大值,一定记得开longlong!

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxx=1e6+10;
char s[maxx];
int sum[maxx]={0};
int sp=0;
#define ll long long
#define mod 1000000009
ll ksm(ll a,ll b) {
    ll ans = 1;
    for(;b;b>>=1LL) {
        if(b & 1) ans = ans * a % mod;
        a = a * a % mod;
    }
    return ans;
}

ll lowbit(ll x){return -x & x;}

const int N = 2e4+10;

ll a[N];
ll ans,n,m,mx1,mx2;

int main()
{
    cin>>n;
    for(int i = 1;i <= n; ++i) {
        cin>>a[i];
    }
    for(int i = 1,j;i < n; ++i) {//枚举窗口长度
        mx1=max(a[i],a[i+1]);
        mx2=min(a[i],a[i+1]);
        ans+=mx2;
        for(j=i+2;j<=n;j++)
        {
            if(a[j]>=mx1)
            {
                mx2=mx1;
                mx1=a[j];
            }
            else if(a[j]>=mx2)
            {
                mx2=a[j];
            }
            
            ans+=mx2;
        }
    }
    cout<<ans<<endl;
    return 0;
}
View Code

 

posted @ 2022-01-20 15:42  bonel  阅读(71)  评论(0编辑  收藏  举报