3.9
Posted Wally的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.9相关的知识,希望对你有一定的参考价值。
http://codeforces.com/gym/101243
A题
思路:一条鱼有两面,所以当N<=K时间是2倍的单位时间。否则的话应该是N*2/k向上取整。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 int main() 7 { 8 freopen("input.txt","r",stdin); 9 freopen("output.txt","w",stdout); 10 int n,k; 11 while(cin>>n>>k) 12 { 13 if(n<=k) cout<<2<<endl; 14 else{ 15 if((n*2)%k==0) 16 cout<<n*2/k<<endl; 17 else cout<<(n*2/k)+1<<endl;} 18 } 19 return 0; 20 }
B题
还没有看懂题意
C题
思路:从上面图片可以看出来,如果W是奇数时,w=1的部分会被单独列出来,然后从2--W每两个进行计数,最后两行被单独计算。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 struct node 7 { 8 int x; 9 int y; 10 } a[250000]; 11 int cmp(const node &a,const node &b) 12 { 13 if(a.x!=b.x) 14 return a.x<b.x; 15 else 16 return a.y<b.y; 17 } 18 int main() 19 { 20 int n,m; 21 freopen("input.txt","r",stdin); 22 freopen("output.txt","w",stdout); 23 while(~scanf("%d%d",&n,&m)) 24 { 25 if(m==1||n==1) 26 { 27 printf("0\\n"); 28 continue; 29 } 30 if(m==2||n==2) 31 { 32 if(m==2) 33 { 34 printf("%d\\n",n-1); 35 for(int i=1; i<n; i++) 36 printf("%d %d\\n",i,1); 37 } 38 else 39 { 40 printf("%d\\n",m-1); 41 for(int i=1; i<m; i++) 42 printf("%d %d\\n",1,i); 43 } 44 continue; 45 } 46 int k=0; 47 if(m%2==1) 48 { 49 for(int i=1; i<n; i+=2) 50 { 51 a[k].x=i; 52 a[k].y=1; 53 k++; 54 } 55 } 56 for(int i=1; i<=n-2; i++) 57 { 58 for(int j=m%2+1; j<=m; j+=2) 59 { 60 a[k].x=i; 61 a[k++].y=j; 62 } 63 } 64 for(int j=m%2+1; j<=m-1; j++) 65 { 66 a[k].x=n-1; 67 a[k++].y=j; 68 } 69 sort(a,a+k,cmp); 70 printf("%d\\n",k); 71 for(int i=0; i<k; i++) 72 printf("%d %d\\n",a[i].x,a[i].y); 73 } 74 return 0; 75 }
D题
思路:计算字符串中包含多少个(NE、NW、SE、SW)赋值给k,结果是(2^k)%(10^9+7),因为k比较小,所以直接计算或者用快速幂都是可以的。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 #include <map> 7 using namespace std; 8 const int maxn=100005; 9 const int inf=1000000007; 10 char s[maxn]; 11 int main() 12 { 13 freopen("input.txt","r",stdin); 14 freopen("output.txt","w",stdout); 15 //printf("%d\\n",inf); 16 while(~scanf("%s",s)) 17 { 18 int len=strlen(s); 19 int k=0; 20 for(int i=0;i<len;i++) 21 { 22 if(s[i]==\'N\'&&i<len-1) 23 { 24 if(s[i+1]==\'W\'||s[i+1]==\'E\') 25 { 26 k++; 27 } 28 } 29 if(s[i]==\'S\'&&i<len-1) 30 { 31 if(s[i+1]==\'W\'||s[i+1]==\'E\') 32 { 33 k++; 34 } 35 } 36 } 37 long long ans=1,tmp=2; 38 while(k) 39 { 40 if(k&1) 41 ans=((ans*tmp)%inf+inf)%inf; 42 tmp=(tmp*tmp)%inf; 43 k=k/2; 44 } 45 printf("%lld\\n",ans); 46 } 47 return 0; 48 }
E题
思路:判断当除了最大值之外其他都拿一个蛋糕cet1,和所有人都拿最多的蛋糕时cet2,刚好计算到i=t-1时是否满足cet1<=k<=cet2,是的话打印YES,否则打印NO
1 #include <iostream> 2 #include<cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 7 using namespace std; 8 int a[100005]; 9 long long ans1,ans2; 10 int solve(int n,int k,int t) 11 { 12 long long tmp1,tmp2,cnt1,cnt2,cet1,cet2; 13 if(k>=t&&k<=ans2) return 1; 14 tmp1=t; 15 tmp2=ans2; 16 cnt1=n+a[t]-1; 17 cnt2=ans1; 18 for(int i=1;; i++) 19 { 20 cet1=tmp1+cnt1*i; 21 cet2=tmp2+cnt2*i; 22 if(cet1<=k&&k<=cet2) 23 return 1; 24 if(cet1>k) 25 break; 26 } 27 return 0; 28 29 } 30 int main() 31 { 32 freopen("input.txt","r",stdin); 33 freopen("output.txt","w",stdout); 34 int n,k; 35 while(~scanf("%d%d",&n,&k)) 36 { 37 for(int i=0; i<n; i++) 38 { 39 scanf("%d",&a[i]); 40 ans1+=a[i]; 41 } 42 int t=max_element(a,a+n)-a; 43 for(int i=0; i<t; i++) 44 ans2+=a[i]; 45 if(solve(n,k,t)) printf("YES\\n"); 46 else printf("KEK\\n"); 47 } 48 return 0; 49 }
F题
思路:先使用并查集对于‘=’的x,y进行预处理,然后对‘<\'和’>\'所对应的集合进行处理,然后依据大小填入对应的RBW,最后对于未填入RBW的位置进化判断,如果无法判断填入?
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int maxn=1005; 7 int x[maxn*maxn],y[maxn*maxn],dp[maxn][maxn],flag[maxn],out[maxn],in[maxn]; 8 char ch[maxn],s[maxn*maxn]; 9 int find(int x) 10 { 11 if(flag[x]==x) 12 return x; 13 else 14 return find(flag[x]); 15 } 16 int init(int a,int b) 17 { 18 a=find(a); 19 b=find(b); 20 flag[a]=b; 21 return 0; 22 } 23 int main() 24 { 25 freopen("input.txt","r",stdin); 26 freopen("output.txt","w",stdout); 27 int n,m; 28 while(~scanf("%d%d",&n,&m)) 29 { 30 memset(dp,0,sizeof(dp)); 31 memset(in,0,sizeof(in)); 32 memset(out,0,sizeof(out)); 33 memset(ch,0,sizeof(ch)); 34 for(int i=0;i<=n;i++) 35 flag[i]=i; 36 for(int i=1;i<=m;i++) 37 { 38 scanf("%d%c%d",&x[i],&s[i],&y[i]); 39 } 40 for(int i=1;i<=m;i++) 41 if(s[i]==\'=\') 42 init(x[i],y[i]); 43 for(int i=1;i<=m;i++) 44 { 45 if(s[i]==\'<\') 46 { 47 int yy=find(y[i]); 48 int xx=find(x[i]); 49 dp[yy][xx]=1; 50 out[yy]++; 51 in[xx]++; 52 } 53 else if(s[i]==\'>\') 54 { 55 int yy=find(y[i]); 56 int xx=find(x[i]); 57 dp[xx][yy]=1; 58 out[xx]++; 59 in[yy]++; 60 } 61 } 62 for(int i=1;i<=n;i++) 63 { 64 if(out[i]!=0&&in[i]!=0) 65 { 66 ch[i]=\'R\'; 67 for(int j=1;j<=n;j++) 68 { 69 if(dp[i][j]==1) 70 { 71 int p=find(j); 72 ch[p]=\'B\'; 73 } 74 if(dp[j][i]==1) 75 { 76 int p=find(j); 77 ch[p]=\'W\'; 78 } 79 } 80 } 81 } 82 for(int i=1;i<=n;i++) 83 { 84 int p=find(i); 85 if(ch[p]!=0) 86 ch[i]=ch[p]; 87 else 88 ch[i]=\'?\'; 89 } 90 for(int i=1;i<=n;i++) 91 printf("%c",ch[i]); 92 printf("\\n"); 93 } 94 return 0; 95 }
G题
思路:先使用素数筛找出(10467397/6)中的素数,然后从1--m(素数的最大个数)找出n的3个因子
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 #include <map> 7 using namespace std; 8 const int maxn=10467397/6; 9 int prime[maxn]; 10 bool isprime[maxn]; 11 int sieve(int n) 12 { 13 int p=0; 14 for(int i=0;i<=n;i++) isprime[i]=true; 15 isprime[0]=isprime[1]=false; 16 for(int i=2;i<=n;i++) 17 { 18 if(isprime[i]) 19 { 20 prime[p++]=i; 21 for(int j=2*i;j<=n;j+=i) isprime[j]=false; 22 } 23 } 24 return p; 25 } 26 int main() 27 { 28 int ans=sieve(maxn); 29 int n; 30 freopen("input.txt","r",stdin); 31 freopen("output.txt","w",stdout); 32 //printf("%d\\n",prime[131212]); 33 while(~scanf("%d",&n)) 34 { 35 int k=0; 36 for(int i=0;prime[i]<=n&&i<131212;i++) 37 { 38 if(n%prime[i]==0) 39 { 40 n=n/prime[i]; 41 k++; 42 } 43 if(k==3&&n==1) 44 break; 45 if(k>3) 46 break; 47 } 48 if(k==3&&n==1) 49 printf("YES\\n"); 两行代码自动压缩ViT模型!模型体积减小3.9倍,推理加速7.1倍将 .unpack 从 Python 2.7 翻译到 3.9