念念已久的校賽&&新生賽總算結束啦!

有一說一,每次逸夫樓比賽必罰坐幾個小時,還記得上次新生賽是“優惠卷”罰坐了3個半小時,CSP30分寫完AB題后罰坐2個半小時,CCSP寫了B題60分又罰坐2個小時,今天在場上“Ranking”卡了我4個小時(頭1小時能AC5個題,混個一等獎,也是夠猛了 ),既然結束了,那就來好好地對AC的水題做個總結吧,有空再補剩下的題吧(不得不說,關鑫隊長yyds)
A:賣水果
題意:給出兩個長度為N的字串,水果只有AB兩種,客人只有XY兩種,且客人是按字串順序來的,客人X只要A水果,客人B兩種都要,是否能讓每個客人都買到水果,
思路:其實就是模擬題意,讓你做啥就做啥就好了,只是注意,如果所有客人要求還沒滿足,現有的水果就不滿足條件了,就直接輸出NO就好,
代碼:
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
using namespace std;
int main()
{
int n;
cin>>n;
string f,c;
cin>>f>>c;
int pb=0;
int dex=0;
rep(i,0,n)
{
if(c[i]=='Y')
{
if(pb)
{
pb--;
continue;
}
else
{
if(dex>=n)
{
cout<<"NO"<<endl;
return 0;
}
dex++;
}
}
if(c[i]=='X')
{
while(dex<n)
{
if(f[dex]=='B')
{
pb++;
dex++;
}
else
{
dex++;
goto out;
}
}
if(dex>=n)
{
cout<<"NO"<<endl;
return 0;
}
}
out:;
}
cout<<"YES"<<endl;
}
B:隊伍能力值
題意:給出三個數a,b,c,判斷區間
[
L
,
R
]
[L,R]
[L,R]中有多少個數,這個數能整除a,b,c
思路:其實分析一下就知道,就是看在 [ L , R ] [L,R] [L,R]中有多少個數可以整除a,b,c三個數的最小公倍數,先修改區間的頭尾全變成區間的子區間,且為最小公倍數的整數倍,然后用公式計算即可,
代碼:
#include<bits/stdc++.h>
#define eps 1e-6
#define ll long long
#define MEM(x,y) memset(x,y,sizeof(x))
#define rep(i,a,n) for(int i=a;i<n;i++)
#define fi first
#define se second
const ll mod=1000000007;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
inline long long read()
{
ll k=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
k=k*10+ch-'0';
ch=getchar();
}
return k*f;
}
ll qpow(ll a,ll b)
{
ll s=1;
while(b)
{
if(b&1)
s=s*a;
a=a*a;
b>>=1;
}
return s;
}
ll qpowmod(ll a,ll b,ll c)
{
ll res,t;
res=1;
t=a%c;
while(b)
{
if(b&1)
res=res*t%c;
t=t*t%c;
b>>=1;
}
return res;
}
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b)
{
return a/gcd(a,b)*b;
}
using namespace std;
const int maxn=1100;
bool number[maxn+5];
int prime[maxn+5];
int c=0;
void isprime()
{
int i,j;
memset(number,true,sizeof(number));
for(i=2;i<=maxn;i++)
{
if(number[i])
prime[c++]=i;
for(j=0;j<c&&prime[j]*i<=maxn;j++)
{
number[prime[j]*i]=false;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
int a,b,c;
cin>>a>>b>>c;
ll l,r;
cin>>l>>r;
ll sum=lcm(lcm(a,b),c);
if(sum>r)
{
cout<<"0"<<endl;
return 0;
}
ll le,ri;
if(l%sum==0)
le=l;
else
le=(l/sum+1)*sum;
if(r%sum==0)
ri=r;
else
ri=r/sum*sum;
cout<<(ri-le)/sum+1;
}
C:小明的衣服
坑點:
小明還可以不穿衣服噢QAQ
小明一天可以穿/脫多件衣服噢p^q
哈哈哈沒想到吧
如果用cin和cout即使用了IOS也會超時(我可憐的室友就是這樣被卡的死死的)

題意:小明會根據天氣來加減衣服,在不同的天氣溫度下,會穿不同件的衣服,衣服多了就要脫,少了就要穿,一件衣服算穿/脫一次(也就是說,如果要脫兩件,則算兩次脫衣服)
思路:寫個函式,回傳這個氣溫下要穿幾件(不穿當然是0😁),然后 O ( N ) O(N) O(N)找就行了,注意用read()或者scanf讀入,
代碼:
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
inline long long read()
{
ll k=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
k=k*10+ch-'0';
ch=getchar();
}
return k*f;
}
using namespace std;
int cloth(int t)
{
if(t<=0)
return 3;
if(t<=15)
return 2;
if(t<=30)
return 1;
return 0;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int chuan=0;
int tuo=0;
int now=2;
int n=read();
rep(i,0,n)
{
int num=read();
int temp=cloth(num);
if(temp>now)
{
chuan+=temp-now;
now=temp;
}
else if(temp<now)
{
tuo+=now-temp;
now=temp;
}
}
printf("%d %d\n",chuan,tuo);
}
}
D:函式最小值
題意:
求函式
y
=
∑
i
=
1
n
∣
x
?
i
∣
y=\sum_{i=1}^n \left|x-i\right|
y=∑i=1n?∣x?i∣的最小值
思路:列舉n=1,2,3,4可以發現規律,然后用等引數列求和可以很簡單求出來,
代碼:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll n;
cin>>n;
if(n%2==1)
{
cout<<(n/2)*(n/2+1);
}
else
{
cout<<(n/2*n/2);
}
}
G:銀行記賬
題意:存款每次會有變化,輸出最終的存款
思路:題意很簡單,但是給的資料會很大,所以可以用兩個變數分別存元和分
代碼:
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,n) for(int i=a;i<n;i++)
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
ll sum=0;
ll fen=0;
int m;
cin>>m;
while(m--)
{
string s;
cin>>s;
if(s[0]=='+')
{
ll num=0;
int flag=0;
for(int i=1;i<s.size();i++)
{
if(s[i]=='.')
{
flag=i;
break;
}
num=num*10+s[i]-'0';
}
// cout<<num<<"--"<<endl;
sum+=num;
if(flag)
{
int cnt=0;
ll numm=0;
for(int i=flag+1;i<s.size();i++)
{
numm=numm*10+s[i]-'0';
cnt++;
}
if(cnt==2)
fen+=numm;
else
fen+=numm*10;
}
// cout<<fen<<"--"<<endl;
}
if(s[0]=='-')
{
ll num=0;
int flag=0;
for(int i=1;i<s.size();i++)
{
if(s[i]=='.')
{
flag=i;
break;
}
num=num*10+s[i]-'0';
}
sum-=num;
if(flag)
{
ll numm=0;
int cnt=0;
for(int i=flag+1;i<s.size();i++)
{
numm=numm*10+s[i]-'0';
cnt++;
}
if(cnt==2)
fen-=numm;
else
fen-=numm*10;
}
}
if(fen<0)
{
sum-=fen/-100+1;
fen+=(fen/-100+1)*100;
}
cout<<sum+fen/100<<".";
printf("%02d\n",fen%100);
}
}
}
校賽就寫到這里吧,這一年也算圓滿一點了,未來繼續努力,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/241009.html
標籤:其他
上一篇:大學物理-震動波動光學
