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;
}
}