第九届“图灵杯”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); }
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); }
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"); } }
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]); } }
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; }