2018-2019賽季多校聯合新生訓練賽第八場(2018/12/22)補題題解
阿新 • • 發佈:2018-12-23
感慨
這次有點感冒,昏迷程度比較大中途還溜了
感謝
感謝qut的同學的幫助!!!
A 小X與三角形(數學)
公式
兩邊的和-兩邊的差-1
因為邊最小得大於兩邊的差,邊最大得小於兩邊的和所以說求得是一個開區間內元素的個數
程式碼
#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 a,b; cin>>a>>b; cout<<(a+b)-abs(a-b)-1; }
B 小X與機器人(數學)
比賽昏迷題之一。。。今天早晨起來就瞬間會了
直接列舉各個x看對應直線的方程算出來的y是不是一個整數點即可,然後特判一下相同相同y軸的情況即可
#include <bits/stdc++.h> using namespace std; int bk[2332][2332]; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); double x1,y1,x2,y2; int ans=2; cin>>x1>>y1>>x2>>y2; double k=(y2-y1)/(x2-x1); double b=y1-k*x1; double xx=min(x1,x2); double yy=min(y1,y2); double tx=max(x1,x2); double ty=max(y1,y2); for(double i=xx+1;i<=tx-1;i++) { int t1=k*i+b; double t2=k*i+b; if(t1==t2&&!bk[int(i)][t1]) ans++,bk[int(i)][t1]=1; } if(tx==xx) cout<<ty-yy+1; else if(ty==yy) cout<<tx-xx+1; else cout<<ans; }
C 小X與機器人(數學)
這個直接應用勾股定理。列舉每一個點與這三個點的距離,剩下兩個點的距離和等於最後的答案的那個點的距離
程式碼
#include <bits/stdc++.h> using namespace std; double a[4]; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); double x1,y1,x2,y2,x3,y3; cin>>x1>>y1>>x2>>y2>>x3>>y3; for(double i=1;i<=19;i++) for(double j=1;j<=19;j++) { a[0]=pow((i-x1),2)+pow((j-y1),2); a[1]=pow((i-x2),2)+pow((j-y2),2); a[2]=pow((i-x3),2)+pow((j-y3),2); sort(a,a+3); if(a[0]==a[1]&&a[2]==a[0]+a[1]) return cout<<i<<" "<<j,0; } }
D 小X與縮寫(字串基礎)
考場上寫的很醜也有些昏迷的題
思路應該很多,我這個思路是挺複雜的
程式碼
#include <bits/stdc++.h>
using namespace std;
vector<string> vac;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string a;
getline(cin,a);
stringstream s;
s<<a;
string t,re="",ans="";
int t1=0,t2=0;
while(s>>t)
{
if(t[0]=='(')
t1=1;
if(t1)
{
for(int i=0;i<t.size();i++)
if(isalpha(t[i]))
{
ans+=toupper(t[i]);
break;
}
}
else
{
vac.push_back(t);
continue;
}
for(int i=0;i<t.size();i++)
if(t[i]==')')
{
re+=ans,ans="",t1=0,t2=1;
}
else if(t[i]==','||t[i]=='.')
re+=t[i];
if(t2)
{
vac.push_back(re);
re="";
t2=0;
}
}
for(int i=0;i<vac.size();i++)
{
cout<<vac[i];
if(i!=vac.size()-1)
cout<<" ";
}
}
E 小X與遊戲(貪心)
如果上面的牌小於下面的牌那麼就不選這一堆,否則選這一堆。然後把選出來的牌排序從大到小算總和然後求差
程式碼
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int num[666666];
bool cmp(ll a,ll b)
{
return a>b;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n,p=0,a1=0,a2=0;
cin>>n;
for(int i=0;i<n;i++)
{
int t1,t2;
cin>>t1>>t2;
if(t1>=t2)
num[p++]=t1,num[p++]=t2;
}
sort(num,num+p,cmp);
int f=1;
for(int i=0;i<p;i++)
{
if(f)
a1+=num[i];
else if(!f)
a2+=num[i];
f=!f;
}
cout<<a1-a2;
}
F 小X與佇列(思維)
先開一個棧,把說到的編號放入棧中,然後輸出棧,如果之前輸出過了這個數那麼不再進行輸出。然後再列舉剩下的數,如果沒有在棧中輸出那麼按照順序輸出即可
程式碼
#include <bits/stdc++.h>
using namespace std;
int now[100005],num[100005],p,bk[100005];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
num[i]=i;
while(m--)
{
int t;
cin>>t;
now[p++]=t;
}
for(int i=p-1;i>=0;i--)
if(!bk[now[i]])
cout<<now[i]<<" ",bk[now[i]]=1;
for(int i=1;i<=n;i++)
if(!bk[num[i]])
cout<<num[i]<<" ";
}
G 小X與神牛(不明)
待填坑
H 撲克牌遊戲(語法基礎)
不知道怎麼錯的都。。。我今天早晨起來又打了一遍,整理了一下思路,發現還不讓交。。。
程式碼略。。。今天早晨的程式碼沒有交也沒有存檔了。。。
思路就是找出來那些比他大的,然後注意如果點數相同算一個,然後輸出點數最小的。還得注意a是最大的,具體可以把1改成14
I 換位置遊戲(不明)
待填坑
J 小球裝箱遊戲(結構體排序)
對小球先進行一波排序,先按照大小降序排,如果大小相等那麼按照顏色紅色的排在前面
然後因為n一定是偶數那麼按照前n/2是A箱後n/2是B箱進行挨個計算即可
程式碼(當時昏迷排序規則都寫反了)
#include <bits/stdc++.h>
using namespace std;
struct node
{
int id,sum;
}num[666666];
bool cmp(node a,node b)
{
return a.sum==b.sum?a.id>b.id:a.sum<b.sum;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,r11=0,r12=0,r21=0,r22=0;
cin>>n;
for(int i=0;i<n;i++)
cin>>num[i].sum>>num[i].id;
sort(num,num+n,cmp);
for(int i=0;i<n/2;i++)
if(num[i].id==0)
r11++;
else if(num[i].id==1)
r12++;
for(int i=n/2;i<n;i++)
if(num[i].id==0)
r21++;
else if(num[i].id==1)
r22++;
cout<<r21<<" "<<r22<<"\n"<<r11<<" "<<r12;
}