迎接2019多校聯合新生訓練賽(2018/12/31)
阿新 • • 發佈:2019-01-01
A 新年禮物(數學)
這個題之前cf div2剛剛考過應該都會吧。就是把左邊界×2遍歷一下就可以了
程式碼
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll l,r,sum=0;
cin>>l>>r;
for(ll i=l;i<=r;)
i*=2,sum++;
cout<<sum;
}
B 水(看不懂題)
待填坑
C 滴(物理)
追擊相遇問題其中一個走了一段的距離了,兩個都是勻速直線運動這個物理題應該都會的
程式碼
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); double x,y,t; cin>>x>>y>>t; double tm=x*t/(y-x); double ans=t*x+tm*x; cout<<int(ans); }
D 石(思維)
這個題比較厲害,首先感謝qut同學的幫助
我們發現如果直接去遍歷所有的子集的話那麼對於100來說這個量是巨大的,並且要求有多少不相同的子集和,那麼我們第一想到的事開桶
開完桶之後我們想的就是去遍歷,遍歷怎麼遍歷?怎麼模擬子集的遍歷而且還不T
這裡qut的同學提供了一種O(n*n)的解法
外層的for用來遍歷每個數對於每個數我們需要對前面所有的不重複的數進行一次加法
①首先遍歷一次,把之前的所有的數都加起來然後再bk判定
②把這個數自己bk判定
輸出總共計數的t即可,也可以用set。這裡得用map了因為不知道要記錄多大
程式碼
#include <bits/stdc++.h> using namespace std; typedef long long ll; unordered_map<ll,ll> bk,num; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n,t=0; cin>>n; for(int i=0;i<n;i++) { ll p,q; cin>>p; q=t; for(int j=0;j<q;j++) { if(!bk[p+num[j]]) { bk[p+num[j]]=1; num[t++]=p+num[j]; } } if(!bk[p]) { bk[p]=1; num[t++]=p; } } cout<<t; }
E 穿(字串基礎)
直接暴力列舉即可
程式碼
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[100005],sum[100005],ans[100005];
ll bk[1000][1000],bk1[1000][1000];
ll n,k,re=0;
set<string> st;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string t="";
cin>>n>>k>>num[0];
sum[0]=num[0]%4;
for(int i=1;i<n;i++)
num[i]=(num[i-1]*6807+2831)%201701,sum[i]=num[i]%4;
for(int i=0;i<n;i++)
{
if(sum[i]==0)
t+='A';
else if(sum[i]==1)
t+='T';
else if(sum[i]==2)
t+='C';
else if(sum[i]==3)
t+='G';
}
for(int i=0;i<n-k+1;i++)
{
string te="";
for(int j=0;j<k;j++)
te+=t[i+j];
st.insert(te);
}
cout<<st.size();
}
F 有(不明)
待填坑
G 志(貪心)
拿出來排個序求一下字首和然後加把起來就行了
程式碼
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[100005],sum[100005],ans[100005];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n,re=0;
cin>>n>>num[0];
sum[0]=num[0]%100+1;
for(int i=1;i<n;i++)
num[i]=(num[i-1]*6807+2831)%201701,sum[i]=(num[i]%100)+1;
sort(sum,sum+n);
for(int i=0;i<n;i++)
{
if(i)
ans[i]=ans[i-1]+sum[i];
else
ans[i]=sum[i];
}
for(int i=0;i<n;i++)
re+=ans[i];
cout<<re;
}
H 竟(語法基礎)
注意之間兩個空格,還一次pe可以
程式碼
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n;
cin>>n;
for(int i=1;i<=n;i++)
if(i%2!=0&&i%5!=0)
cout<<i<<" ";
}
I 成(列舉)
先把牆壁塗上色,然後把沒有塗色的方格進行一次判斷,如果左右兩邊都有牆壁的話,那麼可以把這一部分塗色另一種顏色,最後找出顏色數量即可
程式碼
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[100005],sum[100005],ans[100005];
ll bk[1000][1000],bk1[1000][1000];
ll n,re=0;
void dfs(int x,int y)
{
int f=0,ff=0;
for(int i=y;i>=0;i--)
if(bk[x][i])
{
f=1;
break;
}
for(int i=y;i<n;i++)
if(bk[x][i])
{
ff=1;
break;
}
if(f&&ff)
{
for(int i=y;i>=0;i--)
if(!bk[x][i])
bk1[x][i]=1;
else
break;
for(int i=y;i<n;i++)
if(!bk[x][i])
bk1[x][i]=1;
else
break;
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>num[0];
sum[0]=num[0]%10;
for(int i=1;i<n;i++)
num[i]=(num[i-1]*6807+2831)%201701,sum[i]=num[i]%10;
for(int i=0;i<n;i++)
for(int j=0;j<sum[i];j++)
bk[j][i]=1;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(!bk[i][j])
dfs(i,j);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(bk1[i][j])
re++;
cout<<re;
}
J 新年加油(無語)
上來直接輸出就行,然後都錯了。大家都錯了,後來聽qut的說要用Unicode的才行,然後才ac之後又重判了。。。
程式碼
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cout<<"I\n\nW\ni\nl\nl\n\nt\nr\ny\n\nm\ny\n\nb\ne\ns\nt\n\nf\no\nr\n\n2\n0\n1\n9\n!";
}