【C數學題D貪心】Codeforces Round #461(Div.2)
阿新 • • 發佈:2019-01-01
A
copy一個原始檔會新產生一個原始檔和一個副本,copy一個副本會新產生兩個副本,現在有一個原始檔,問能否copy出 個副本和 個原始檔?
瞎搞,注意一些特殊情況。
#include<cstdio>
using namespace std;
int x,y;
int main(){
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
scanf("%d%d",&x,&y);x-=y-1;
if (!y) return puts("No"),0;
if (x<0) return puts("No"),0;
if (y==1&&x) return puts("No"),0;
return puts((x&1)?"No":"Yes"),0;
}
B
問 且 能組成三角形的三元組個數 。
暴枚,列舉兩個就行了。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=2500;
int n,ans;
int main(){
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=i;j<=n;j++){
int k=i^j;if (k<j||k>n) continue;
ans+=i+j>k;
}
return printf("%d\n",ans),0;
}
C
問 中是否存在 。
JYZdalao太強了,直接秒了此題。考慮列舉 ,當 時, 只能為 ,當 時, 只能為 ( 已經被佔掉了),當 時, 只能為 ……以此類推,只要不存在 ,就說明存在 ,否則不存在。
直接列舉試試?驚奇的發現竟然過了?WHY?
觀察滿足上述條件的 ,發現只要加個 ,就滿足 了,也就是說 ,因為 比較大啊,所以就不會TLE了。
#include<cstdio>
using namespace std;
typedef long long LL;typedef long double DB;
LL n,K;
int main(){
freopen("C.in","r",stdin);
freopen("C.out","w",stdout);
scanf("%lld%lld",&n,&K);bool fl=false;
for (int i=1;i<=K;i++)
if (n%i<i-1) {fl=true;break;}
return puts(fl?"No":"Yes"),0;
}
D
給出 個由 和 組成的串,一個串的價值 為 的 個數。現在選擇一種方案將 個串接起來,求接起來的串的最大價值。
給兩個串 定義優先順序,如果 ,則 的優先順序高,然後按照這個優先順序排序,因為 說明 放在 前面更好(易證這個條件適用於全域性),所以最後得到的是最大價值串。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=100000;
int n,S[maxn+5],H[maxn+5],ID[maxn+5];
char s[maxn+5];LL tot[maxn+5],ans;
inline bool cmp(const int &a,const int &b) {