日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ATC打ABC142有感

發(fā)布時間:2025/7/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ATC打ABC142有感 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • A
  • B
  • C
  • D
  • E
  • F
  • 小結(jié)

我怕不是傻子吧!!!

沒有AK啊啊啊。

算了原本就是個蒟蒻。

A

這道題目的大意就是求\(1-n\)里面奇數(shù)的個數(shù)占\(1-n\)個數(shù)的多少

真SB的題目

#include<cstdio> using namespace std; int n; double a; int main() {scanf("%d",&n);if(n&1)printf("%lf\n",(n/2+1)*1.0/n);else printf("%lf\n",(n/2)*1.0/n);return 0; }

B

類似于淘淘摘蘋果,給你個高度,問你有多少個數(shù)字大于等于他。

#include<cstdio> using namespace std; int n,m,ans; int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int x;scanf("%d",&x);if(x>=m)ans++;}printf("%d\n",ans);return 0; }

C

題目大意就是給你第\(i\)個同學(xué)之前有\(ai-1\)個同學(xué)進(jìn)入,然后問你進(jìn)來先后的同學(xué)編號。

#include<cstdio> #include<algorithm> #define N 110000 using namespace std; int n,a[N],what[N]; inline bool cmp(int x,int y){return a[x]<a[y];} int main() {scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);what[i]=i;}sort(what+1,what+n+1,cmp);//這個很類似我打的離散化呀for(int i=1;i<n;i++)printf("%d ",what[i]);printf("%d\n",what[n]);return 0; }

D

題目大意就是給你\(A,B\),然后你需要求出\(A,B\)的公共約數(shù),同時在約數(shù)中找到最多的約數(shù)個數(shù),使得約數(shù)之間互質(zhì)。

其實(shí)最優(yōu)的方案就是找到最多的兩個數(shù)字最多的公共質(zhì)因數(shù)個數(shù)。

但是需要注意一點(diǎn)估計(jì)也就我腦抽了:

\(x\%i==0\)但是\(y\%i!=0\),但是此時有可能\(y\%(x/i)==0\),結(jié)果我當(dāng)時就寫掛了。

#include<cstdio> #include<cmath> using namespace std; typedef long long LL; LL top; bool pd1(LL x) {if(x==1)return true;for(LL i=sqrt(x);i>=2;i--){if(x%i==0)return false;}return true; } void pd2(LL x,LL y) {x>y?x^=y^=x^=y:0;LL ed=sqrt(x);for(LL i=1;i<=ed;i++){if(x%i==0){if(y%i==0 && pd1(i)==1)top++;if(y%(x/i)==0 && i*i!=x && pd1(x/i)==1)top++;}} } LL n,m; int main() {scanf("%lld%lld",&n,&m);pd2(n,m);printf("%lld\n",top);return 0; }

E

也就是告訴你一些上鎖的箱子,然后給你一些鑰匙,每個鑰匙可重復(fù)使用,要多少錢,能開什么箱子。

一個狀壓DP即可,連我這個DP傻子都會寫的狀壓,肯定是道SB題。

#include<cstdio> #include<cstring> #define N 20 #define M 1100 #define ALL 71000 using namespace std; int n,m,f[ALL],b[M],c[M],lim; inline int mymin(int x,int y){return x<y?x:y;} int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)lim=(lim<<1)^1;for(int i=1;i<=lim;i++)f[i]=999999999;for(int i=1;i<=m;i++){int k;scanf("%d%d",&b[i],&k);for(int j=1;j<=k;j++){int y;scanf("%d",&y);c[i]^=(1<<(y-1));}}f[0]=0;for(int i=0;i<lim;i++){for(int j=1;j<=m;j++)f[i|c[j]]=mymin(f[i|c[j]],f[i]+b[j]);}if(f[lim]==999999999)f[lim]=-1;printf("%d\n",f[lim]);return 0; }

F

全場唯一一個比較有難度的題目。可惜我圖論自從不寫網(wǎng)絡(luò)流的題目后,整個人就變SB了。

所以我就只有D、F沒做,差點(diǎn)AK了QAQ。

大概就是這樣子的:

你對原圖跑一遍強(qiáng)聯(lián)通,然后對于一個強(qiáng)聯(lián)通,必然有一個誘導(dǎo)子圖,然后你先DFS找到一個環(huán),然后在回溯的過程中如果發(fā)現(xiàn)環(huán)中有兩個不相鄰的點(diǎn)可以直接相通的話,那么就可以直接把原本兩個點(diǎn)之間的路徑截去了。

大概就是這樣:

DFS加上刪邊使得這個圖的入度出度都是1。

你也可以理解為你現(xiàn)在找到一個很大的核桃,然后你一直盤他盤他,把他盤到你想要的的樣子。

#include<cstdio> #include<cstring> #define N 1100 #define M 2100 using namespace std; struct node {int y,next; }a[M];int len,last[N]; inline void ins(int x,int y){a[++len].y=y;a[len].next=last[x];last[x]=len;} int dfn[N],low[N],now,sta[N],top,bel[N],cnt[N],blen; inline int mymin(int x,int y){return x<y?x:y;} void dfs(int x) {dfn[x]=low[x]=++now;sta[++top]=x;for(int k=last[x];k;k=a[k].next){int y=a[k].y;if(!dfn[y]){dfs(y);low[x]=mymin(low[x],low[y]);}else if(!bel[y])low[x]=mymin(low[x],dfn[y]);}if(low[x]==dfn[x]){++blen;while(sta[top]!=x){bel[sta[top]]=blen;top--;cnt[blen]++;}top--;bel[x]=blen;cnt[blen]++;} } int list[N],head,st; bool v[N]/*表示這些點(diǎn)是否選為了答案*/; int be[N];//表示目前為這個圖的第幾個被找到的 void dfs2(int x) {if(v[x]){int i=head;for(;list[i]!=x;i--)be[list[i]]=i;be[list[i]]=i;return ;}v[x]=true;list[++head]=x;for(int k=last[x];k;k=a[k].next){int y=a[k].y;if(bel[x]==bel[y]){dfs2(y);break;}}//只搜索連通塊的話必然可以找到一種聯(lián)通塊的方法if(be[x]){for(int k=last[x];k;k=a[k].next){int y=a[k].y;if(be[y])//請開始你的盤核桃行為 {if(be[y]>be[x]/*是在后面的話*/){for(int i=be[x]+1;i<be[y];i++)be[list[i]]=0;}else//在前面 {for(int i=1;i<be[y];i++)be[list[i]]=0;for(int i=be[x]+1;i<=head;i++)be[list[i]]=0;}}}} } int n,m; int main() {scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);ins(x,y);}for(int i=1;i<=n;i++){if(!bel[i])dfs(i);}for(int i=1;i<=n;i++){if(cnt[bel[i]]>1){dfs2(i);int ans=0;for(int j=1;j<=n;j++)if(be[j])ans++;printf("%d\n",ans);for(int j=1;j<=n;j++)if(be[j])printf("%d\n",j);return 0;}}printf("-1\n");return 0; }

小結(jié)

我是SB,下次一定要爭取AK,踏向更強(qiáng)的征程!

轉(zhuǎn)載于:https://www.cnblogs.com/zhangjianjunab/p/11629492.html

總結(jié)

以上是生活随笔為你收集整理的ATC打ABC142有感的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。