D.「金」初心如金
題意:
給n,首先給一個奇數,如果這個數是素數則ans=1,否則ans=0
接下來n-1次原本也是給一個奇數,但實際給的數=lastans^原本要給的奇數
問前n-1個數的ans是多少(是素數爲1,不是素數爲0),輸出這個ans
思路:
因爲每次給的都是奇數,而每一次實際給的數=lastans^原本要給的奇數,
所以我們可以通過實際給的數,倒推出lastans的值。
題目輸入的最後一個數不需要輸出也暗示了做法。
code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
signed main(){
signed n;
scanf("%d",&n);
ll x;
scanf("%lld",&x);
for(int i=2;i<=n;i++){
scanf("%lld",&x);
if(x&1)puts("0");
else puts("1");
}
return 0;
}
E.「火」烈火燎原
題意:
現在有一棵樹G(無環),定義它的“小樹”是X(G),小樹X(G)的點集是G的邊集
在“小樹”中,兩點之間有邊,當且僅當這兩個點對應的邊在原圖上有公共點
給定一棵樹G,它的X(X(G))有多少個點?
思路:
X(G)的點數是G的邊數,
假設G中點x的度爲k,即這k條邊都連接x,那麼X(G)中對應的這K個點相鄰,兩兩匹配共有k(k-1)/2個邊
所以X(G)中邊的數量就是d(i)(d(i)-1)/2,又因爲X(G)的點數是G的邊數,
所以X(X(G))的點數就是原圖中的d(i)(d(i)-1)/2
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=1e5+5;
int d[maxm];
signed main(){
int n;
cin>>n;
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
d[a]++;
d[b]++;
}
int ans=0;
for(int i=1;i<=n;i++){
ans+=d[i]*(d[i]-1)/2;
}
cout<<ans<<endl;
return 0;
}
H.「土」巨石滾滾
題意:
有一個土球和n個障礙
土球有一個穩定性x,如果x < 0,它會立刻散架
每衝撞一個障礙,土球會喪失ai的穩定性,衝撞之後,又會從障礙身上回饋bi的穩定性
能否合理的安排障礙的順序,在保證土球不散架的情況下,是否可以將障礙全部撞毀呢?
可以輸出yes,不可以輸出no
思路:
bzoj3709原題
貪心。
把障礙分成兩種,第一種是回覆>傷害的,按照傷害從低到高去打就是最優的。
第二種是傷害>回覆的。通過所有障礙的時候,血量一定是固定的,所以要先過回血多的,再過回血少的。
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct Node{
int a,b;
};
vector<Node>l,r;
bool cmp1(Node a,Node b){
return a.a<b.a;
}
bool cmp2(Node a,Node b){
return a.b>b.b;
}
signed main(){
int T;
cin>>T;
while(T--){
l.clear();
r.clear();
int n,x;
cin>>n>>x;;
for(int i=1;i<=n;i++){
int a,b;
cin>>a>>b;
if(a<=b)l.push_back({a,b});//回血
else r.push_back({a,b});//掉血
}
sort(l.begin(),l.end(),cmp1);
sort(r.begin(),r.end(),cmp2);
int ok=1;
for(auto i:l){
if(!ok)break;
if(x<=i.a){
ok=0;
}else{
x-=i.a;
x+=i.b;
}
}
for(auto i:r){
if(!ok)break;
if(x<=i.a){
ok=0;
}else{
x-=i.a;
x+=i.b;
}
}
if(ok)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}