https://vjudge.net/contest/325824#overview
只有后4题和H题和I题的题解,其他题只挂了代码。不会的同学去群里问问过的同学。
- N题 思维题
题解:没魔法的时候:按顺序来,用一个cnt来计数,遇到左括号++,右括号就消耗一个–,中间有一次cnt<0那么代表这个串已经不合法了输出No。有魔法的时候其实就是cnt<0有一次机会,那么我们第一次cnt<0不输出No就可以了。
这道题对应的是CF1200分难度的题。大家先对难度有一个模糊的概念。
代码:看了一圈只有littlefish(19 小?)的代码相对简单点
#include<stdio.h>
int main(void){
int n;
char a[220000];
scanf("%d",&n);
int i=0,j=0,k=0,t=0;
scanf("%s",&a);
for(i=0;i<n;i++){
if(a[i]=='(') j++; else j--;
if(j==-2) break;
}
if (j!=0) printf("No"); else printf("Yes");
return 0;
}
我的代码(c++,可以尝试去熟悉下c++,看不懂没关系,只是熟悉下
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define forn(i,n) for(int i=0;i<n;i++)
#define for1(i,n) for(int i=1;i<=n;i++)
#define IO ios::sync_with_stdio(false);cin.tie(0)
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
int main(){
IO;
int n;cin>>n;
string s;cin>>s;
int cnt = 0;
bool ok = 1;
forn(i,n){
if(s[i]=='(') cnt++;
else{
if(cnt) cnt--;
else{
if(ok) ok = 0;
else return cout<<"No"<<'\n',0;
}
}
}
if(!ok) cnt--;
if(cnt) return cout<<"No"<<'\n',0;
cout<<"Yes"<<'\n';
return 0;
}
- M题 模拟题直接看代码吧
最好看的是Libm学长的代码(c++版,但是基本和C语言差不多,cout是printf,头文件无所谓,看看思路就可以了
#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
int main(){
int n;
while(cin>>n){
int s[100][100];
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
s[i][j]=s[i-1][j]+s[i-1][j-1];
s[1][1]=1;
if(j!=i) cout<<s[i][j]<<" ";
else cout<<s[i][j]<<endl;
}
}
cout<<endl;
}
}
- L题 模拟题
有很多人写的很麻烦,同样直接上代码
代码:- Anonytt(第一弹Top 1)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n){
if(n==0) break;
int a=0,q=n;
while(q>0){
a+=q%10;
q/=10;
}
int b=0;
q=n;
while(q>0){
b+=q%12;
q/=12;
}
int c=0;
q=n;
while(q>0){
c+=q%16;
q/=16;
}
if(a==b&&b==c) printf("%d is a Sky Number.\n",n);
else printf("%d is not a Sky Number.\n",n);
}
}
我的代码
#include <bits/stdc++.h>
using namespace std;
bool check(int n){
int x,y,z,sum1 = 0,sum2 = 0,sum3 = 0;x = y = z = n;
while(x){
sum1+=x%10;
x/=10;
}
while(y){
sum2+=y%12;
y/=12;
}
while(z){
sum3+=z%16;
z/=16;
}
return (sum1==sum2&&sum1==sum3);
}
int main(){
int n;
while(cin>>n&&n){
if(check(n)) cout<<n<<" is a Sky Number.\n";
else cout<<n<<" is not a Sky Number.\n";
}
return 0;
}
- K题 求多个数lcm
思路:学会gcd(辗转相除法)之后,就迎刃而解了。a和b的lcm = a/gcd(a,b)*b(先除可以防止有些题爆int或者爆long long)
那么多个数就一个个来呗。
代码:
同样是Top1的代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n){
int a[n+5],ans;
cin>>a[1];
ans=a[1];
for(int i=2;i<=n;i++){
cin>>a[i];
ans=ans/__gcd(ans,a[i])*a[i];
}
cout<<ans<<endl;
}
}
Libm代码c++
#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int n;
while(cin>>n){
ll now;
for(int i=1;i<=n;i++){
if(i==1) cin>>now;
else{
ll t;cin>>t;
now=now*t/__gcd(now,t);
}
}
cout<<now<<endl;
}
}
- H题
大家都是用冒泡排序做的,这种排序的时间复杂度很高或者说很慢,但是这题不卡。有个别会c++的同学用的sort做的,比如Top2Top3
直接上代码吧,不会冒泡的去百度冒泡排序
Top1代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n&&n){
int a[100],b[100];
for(int i=1;i<=n;i++){
cin>>a[i];
}
int temp=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i;j++){
if(abs(a[j])>abs(a[j+1])){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
cout<<a[n];
for(int i=n-1;i>=1;i--){
cout<<" "<<a[i];
}
cout<<endl;
}
}
那么用sort怎么在c++做呢,c++里面有一个自带函数sort,排序速度很快,时间复杂度是O(n*logn)的。举个例子1e5(100000)个数字,冒泡排序最慢要5秒多,sort只用10-20ms.
Top3代码 看不懂没关系
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
return abs(a) > abs(b);
}
int a[110];
int main()
{
int n;
while(cin >> n&&n){
for(int i = 0; i < n; i++) cin >> a[i];
sort(a,a+n,cmp);
cout << a[0];
for(int i = 1; i < n; i++) cout <<" " << a[i] ;
cout << endl;
}
return 0;
}
- I题
思路:一个数x从如果都不能被【2-sqrt(x)】这之间的数整除那么就是素数。
代码:
我的c++版
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define forn(i,n) for(int i=0;i<n;i++)
#define for1(i,n) for(int i=1;i<=n;i++)
#define IO ios::sync_with_stdio(false);cin.tie(0)
bool judge(int x){
x = x*x+x+41;
int z = sqrt(x);
for(int i = 2;i<=z;i++){
if(x%i==0) return 0;
}
return 1;
}
int main(){
IO;
int l,r;
while(cin>>l>>r&&(l||r)){
bool ok = 1;
for(int i = l;i<=r;i++){
if(!judge(i)) ok = 0;
}
if(ok) cout<<"OK"<<'\n';
else cout<<"Sorry"<<'\n';
}
return 0;
}
做不完题没关系,我刚入坑acm的时候新生已经出到第4弹了,我从第一弹才开始刷,后来在新生赛前已经追上了Top的进度
分界线
被压榨成功,我把所有题代码都粘出来,下次别压榨我了。orz 因为我急着补题,博客简单写了,看到好看Top的代码就粘过来了。求轻喷
- A题
在题目下面有答案 - B题
代码:
C版
#include<stdio.h>
int main()
{
unsigned int a,sum,i;
while(scanf("%d",&a) != EOF)
{
sum = 0;
for(i = 1;i <= a;i++)
sum += i;
printf("%d\n\n",sum);
}
return 0;
}
c++版
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a;
while(cin>>a)
{
int c=0;
for(int i=1;i<=a;i++)
{
c+=i;
}
cout<<c<<endl;
cout<<endl;
}
}
- C题
c
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
double x;
while(~scanf("%lf",&x)){
printf("%.02lf\n",abs(x));
}
return 0;
}
c++
#include<bits/stdc++.h>
using namespace std;
int main()
{
double a;
while(cin>>a)
{
double c=abs(a);
printf("%.2f\n",c);
}
}
- D题
C
#include<stdio.h>
#define PI 3.1415927
int main(void)
{
double r,v;
while(~scanf("%lf",&r))
{
v=r*r*r*PI*4/3;
printf("%.3lf\n",v);
}
return 0;
}
C++
#include<bits/stdc++.h>
using namespace std;
#define PI 3.1415927
int main()
{
double a;
while(cin>>a)
{
double c=4*PI*a*a*a/3;
printf("%.3f\n",c);
}
}
- E题
C
#include<stdio.h>
int main(void)
{
int n;
scanf("%d\n",&n);
while(n>0)
{
float a,b,c;
scanf("%f%f%f",&a,&b,&c);
if(a>=b+c)
printf("NO\n");
else if(b>=a+c)
printf("NO\n");
else if(c>=a+b)
printf("NO\n");
else
printf("YES\n");
n--;
}
return 0;
}
C++
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
double a,b,c;
cin>>a>>b>>c;
if(a+b>c&a+c>b&&b+c>a) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
- F
C
#include <stdio.h>
int main(void)
{
int n;
while(~scanf("%d",&n))
{
if(n<60&&n>=0)
printf("E\n");
else if(n<70&&n>=60)
printf("D\n");
else if(n<80&&n>=70)
printf("C\n");
else if(n<90&&n>=80)
printf("B\n");
else if(n<=100&&n>=90)
printf("A\n");
else
printf("Score is error!\n");
}
return 0;
}
C++
#include<bits/stdc++.h>
using namespace std;
int main()
{
double n;
while(cin>>n)
{
if(n>=90&&n<=100) cout<<"A"<<endl;
else if(n>=80&&n<=89) cout<<"B"<<endl;
else if(n>=70&&n<=79) cout<<"C"<<endl;
else if(n>=60&&n<=69) cout<<"D"<<endl;
else if(n>=0&&n<=59) cout<<"E"<<endl;
else cout<<"Score is error!"<<endl;
}
}
- G
C
#include <stdio.h>
#include <math.h>
int main(void)
{
double x1,y1,x2,y2,a,b,c;
while(~scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2))
{
a=(x1-x2)*(x1-x2);
b=(y1-y2)*(y1-y2);
c=(a+b);
printf("%.2lf\n",sqrt(c));
}
return 0;
}
c++
#include<bits/stdc++.h>
using namespace std;
int main()
{
double a,b,c,d;
while(cin>>a>>b>>c>>d)
{
double l;
l=sqrt((c-a)*(c-a)+(d-b)*(d-b));
printf("%.2f\n",l);
}
}
- J
C
#include<stdio.h>
int main(void)
{
int n,x;
while(~scanf("%d",&n))
{
x=1;
while(n>1)
{
x=x*2+2;
n--;
}
printf("%d\n",x);
}
return 0;
}
C++
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n){
int sum=1;
for(int i=1;i<=n-1;i++){
sum=(sum+1)*2;
}
cout<<sum<<endl;
}
}