ATC打ABC142有感
目錄
- A
- B
- C
- D
- E
- F
- 小結(jié)
我怕不是傻子吧!!!
沒(méi)有AK啊啊啊。
算了原本就是個(gè)蒟蒻。
A
這道題目的大意就是求\(1-n\)里面奇數(shù)的個(gè)數(shù)占\(1-n\)個(gè)數(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
類(lèi)似于淘淘摘蘋(píng)果,給你個(gè)高度,問(wèn)你有多少個(gè)數(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\)個(gè)同學(xué)之前有\(ai-1\)個(gè)同學(xué)進(jìn)入,然后問(wèn)你進(jìn)來(lái)先后的同學(xué)編號(hào)。
#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);//這個(gè)很類(lèi)似我打的離散化呀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ù)個(gè)數(shù),使得約數(shù)之間互質(zhì)。
其實(shí)最優(yōu)的方案就是找到最多的兩個(gè)數(shù)字最多的公共質(zhì)因數(shù)個(gè)數(shù)。
但是需要注意一點(diǎn)估計(jì)也就我腦抽了:
\(x\%i==0\)但是\(y\%i!=0\),但是此時(shí)有可能\(y\%(x/i)==0\),結(jié)果我當(dāng)時(shí)就寫(xiě)掛了。
#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
也就是告訴你一些上鎖的箱子,然后給你一些鑰匙,每個(gè)鑰匙可重復(fù)使用,要多少錢(qián),能開(kāi)什么箱子。
一個(gè)狀壓DP即可,連我這個(gè)DP傻子都會(huì)寫(xiě)的狀壓,肯定是道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
全場(chǎng)唯一一個(gè)比較有難度的題目。可惜我圖論自從不寫(xiě)網(wǎng)絡(luò)流的題目后,整個(gè)人就變SB了。
所以我就只有D、F沒(méi)做,差點(diǎn)AK了QAQ。
大概就是這樣子的:
你對(duì)原圖跑一遍強(qiáng)聯(lián)通,然后對(duì)于一個(gè)強(qiáng)聯(lián)通,必然有一個(gè)誘導(dǎo)子圖,然后你先DFS找到一個(gè)環(huán),然后在回溯的過(guò)程中如果發(fā)現(xiàn)環(huán)中有兩個(gè)不相鄰的點(diǎn)可以直接相通的話,那么就可以直接把原本兩個(gè)點(diǎn)之間的路徑截去了。
大概就是這樣:
DFS加上刪邊使得這個(gè)圖的入度出度都是1。
你也可以理解為你現(xiàn)在找到一個(gè)很大的核桃,然后你一直盤(pán)他盤(pán)他,把他盤(pá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];//表示目前為這個(gè)圖的第幾個(gè)被找到的 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])//請(qǐng)開(kāi)始你的盤(pán)核桃行為 {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,下次一定要爭(zhēng)取AK,踏向更強(qiáng)的征程!
轉(zhuǎn)載于:https://www.cnblogs.com/zhangjianjunab/p/11629492.html
總結(jié)
以上是生活随笔為你收集整理的ATC打ABC142有感的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用rem适配不同屏幕的移动设备
- 下一篇: 联想员工亲历联想大裁员:公司不是家