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 }
View Code

 

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 }
View Code

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 }
View Code

 

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 }
View Code

 

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 }
View Code

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

上周热点回顾(3.9-3.15)

FindBugs1.3.9规则整理

Python 3.9 MetaClass 属性与 Classmethod 属性

LLVM 3.9 发布,编译器架构