Codeforces Round #460 (Div. 2)

最后把记忆化搜索乱搞的点给写串了,又炸裂了

但是因为馒神操作了一番 避免了掉rating

T1 T2 T3 sb题,随便搞一搞50分钟过

  1 // T1:
  2 #include<iostream>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<cstdlib>
  6 #include<cmath>
  7 #include<algorithm>
  8 #include<queue>
  9 #include<vector>
 10 #include<map>
 11 #define inf 2139062143
 12 #define ll long long
 13 #define MAXN
 14 #define MOD
 15 using namespace std;
 16 inline int read()
 17 {
 18     int x=0,f=1;char ch=getchar();
 19     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
 20     while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
 21     return x*f;
 22 }
 23 int n,m;
 24 double a,b,t;
 25 int main()
 26 {
 27     n=read(),m=read(),t=1000.0;
 28     for(int i=1;i<=n;i++) {scanf("%lf%lf",&a,&b);t=min(t,a/b);} 
 29     printf("%.8lf",t*m);
 30 }
 31 // T2:
 32 #include<iostream>
 33 #include<cstdio>
 34 #include<cstring>
 35 #include<cstdlib>
 36 #include<cmath>
 37 #include<algorithm>
 38 #include<queue>
 39 #include<vector>
 40 #include<map>
 41 #define inf 2139062143
 42 #define ll long long
 43 #define MAXN
 44 #define MOD
 45 using namespace std;
 46 inline int read()
 47 {
 48     int x=0,f=1;char ch=getchar();
 49     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
 50     while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
 51     return x*f;
 52 }
 53 int k;
 54 int check(int x)
 55 {
 56     int res=0;
 57     while(x) res+=x%10,x/=10;
 58     return res==10;
 59 }
 60 int main()
 61 {
 62     k=read();
 63     int i=19;
 64     while(k)
 65     {
 66         if(check(i)) k--;
 67         i++;
 68     }
 69     printf("%d",i-1);
 70 }
 71 // T3:
 72 #include<iostream>
 73 #include<cstdio>
 74 #include<cstring>
 75 #include<cstdlib>
 76 #include<cmath>
 77 #include<algorithm>
 78 #include<queue>
 79 #include<vector>
 80 #include<map>
 81 #define inf 2139062143
 82 #define ll long long
 83 #define MAXN
 84 #define MOD
 85 using namespace std;
 86 inline int read()
 87 {
 88     int x=0,f=1;char ch=getchar();
 89     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
 90     while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
 91     return x*f;
 92 }
 93 int n,m,k,ans,tmp;
 94 char mp[2010][2010];
 95 int main()
 96 {
 97     n=read(),m=read(),k=read();
 98     for(int i=0;i<n;i++) scanf("%s",mp[i]);
 99     for(int i=0;i<n;i++)
100     {
101         int j=0;
102         while(j<m)
103         {
104             tmp=j;
105             while(mp[i][j]=='.'&&j<m) j++;
106             ans+=max(0,j-tmp-k+1);
107             while(mp[i][j]!='.'&&j<m) j++;
108         }
109     }
110     for(int j=0;j<m;j++)
111     {
112         int i=0;
113         while(i<n)
114         {
115             tmp=i;
116             while(mp[i][j]=='.'&&i<n) i++;
117             ans+=max(0,i-tmp-k+1);
118             while(mp[i][j]!='.'&&i<n) i++;
119         }
120     }
121     if(k==1) ans/=2;
122     printf("%d",ans);
123 }
View Code

T4: 

一个有向图 点上有字母

在图上找一条路径 使路径上经过的点上出现次数最多字母的出现次数最大

思路:

设一个dp数组 dp i j 表示第i个点 j字母的个数

然后边拓扑边转移

就搞出来了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #define inf 2139062143
11 #define ll long long
12 #define MAXN 301010
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
18     while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
19     return x*f;
20 }
21 int n,fst[MAXN],nxt[MAXN<<1],to[MAXN<<1],cnt,m,val[MAXN],f[MAXN][30],ind[MAXN],ans,tot;
22 void add(int u,int v) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,ind[v]++;}
23 int main()
24 {
25     n=read(),m=read();int a,b;
26     char ch[MAXN];
27     scanf("%s",ch);
28     for(int i=0;i<n;i++) val[i+1]=ch[i]-'a'+1;
29     for(int i=1;i<=m;i++) {a=read(),b=read();add(a,b);if(a==b) {puts("-1");return 0;}}
30     queue <int> q;
31     for(int i=1;i<=n;i++) {f[i][val[i]]=1;if(!ind[i]) q.push(i);}
32     int x;
33     while(!q.empty())
34     {
35         x=q.front();q.pop();
36         tot++;
37         for(int i=fst[x];i;i=nxt[i])
38         {
39             ind[to[i]]--;
40             if(!ind[to[i]]) q.push(to[i]);
41             for(int j=1;j<=26;j++)
42             {
43                 if(f[to[i]][j]<f[x][j]&&j!=val[to[i]]) f[to[i]][j]=f[x][j],ans=max(ans,f[to[i]][j]);
44                 if(f[to[i]][j]<f[x][j]+1&&j==val[to[i]]) f[to[i]][j]=f[x][j]+1,ans=max(ans,f[to[i]][j]);
45             }
46         }
47     }
48     if(tot!=n) {puts("-1");return 0;}
49     printf("%d",ans);
50 }
View Code

 T5:

求一个正整数n<=x 使 

 

思路:

通过题解的打表

然后可以枚举j 可以知道 b·a^(-j)  和 j-i 对p同余

然后就求一下逆元搞一下 求一下i 就行了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #define inf 2139062143
11 #define ll long long
12 #define MAXN 1001001
13 using namespace std;
14 inline ll read()
15 {
16     ll x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
18     while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
19     return x*f;
20 }
21 ll inv[MAXN],a,b,p,x,tmp=1,ans;
22 int main()
23 {
24     a=read(),b=read(),p=read(),x=read(),inv[1]=1;
25     for(ll i=2;i<p;i++) inv[i]=(p-p/i)*inv[p%i]%p;
26     for(ll i=0;i<p-1;i++,(tmp*=a)%=p)
27         ans+=(x-((i+p-b*inv[tmp]%p)%p*(p-1)+i)+p*(p-1))/p/(p-1);
28     printf("%I64d",ans);
29 }
View Code
原文地址:https://www.cnblogs.com/yyc-jack-0920/p/8397738.html