1. 程式人生 > >【C數學題D貪心】Codeforces Round #461(Div.2)

【C數學題D貪心】Codeforces Round #461(Div.2)

A

copy一個原始檔會新產生一個原始檔和一個副本,copy一個副本會新產生兩個副本,現在有一個原始檔,問能否copy出 x 個副本和 y 個原始檔?

瞎搞,注意一些特殊情況。

#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

(a,b,c),1abcn,axorbxorc=0a,b,c 能組成三角形的三元組個數 (n2500)

暴枚,列舉兩個就行了。

#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

1i<jk 中是否存在 nmodi=nmodj(1n,k1018)

JYZdalao太強了,直接秒了此題。考慮列舉 j ,當 j=1 時,nmodj 只能為 0 ,當 j=2 時,nmodj 只能為 1 ( 0 已經被佔掉了),當 j=3 時, nmodj 只能為 2 ……以此類推,只要不存在 nmodj<j1 ,就說明存在 i,j ,否則不存在。

直接列舉試試?驚奇的發現竟然過了?WHY?

觀察滿足上述條件的 n ,發現只要加個 1 ,就滿足 (n+1)modk=0 了,也就是說 (n+1)mod[1,2,,k]=0 ,因為 [1,2,,k] 比較大啊,所以就不會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

給出 n 個由 sh 組成的串,一個串的價值 vali<j,Si=s,Sj=hi,j 個數。現在選擇一種方案將 n 個串接起來,求接起來的串的最大價值。

給兩個串 A,B 定義優先順序,如果 val(AB)>val(BA) ,則 A 的優先順序高,然後按照這個優先順序排序,因為 val(AB)>val(BA) 說明 A 放在 B 前面更好(易證這個條件適用於全域性),所以最後得到的是最大價值串。

#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) {