Codeforces Round #383 _python作死系列

A. Arpa’s hard exam and Mehrdad’s naive cheat

题意求1378的n次方的最后一位,懒的写循环节 瞎快速幂

py3 int和LL 合并为int了

 1 def q_(x):
 2     a = 8
 3     ans = 1
 4     while(x>0):
 5         if(x&1):
 6             ans = ans*a%10
 7         a = a*a%10
 8         x = x//2
 9     print(ans%10)
10 
11 c =int(input())
12 q_(c)
View Code

 

B. Arpa’s obvious problem and Mehrdad’s terrible solution

ZZ题  读题浪费了很长时间

C. Arpa's loud Owf and Mehrdad's evil plan

找环  不合法的情况肯定是度为单数的点 然后 DFS就ok  偶数/2 求lcm

 1 def gcd(x,y):
 2     return x if y==0 else gcd(y,x%y)
 3 def lcm(x,y):
 4     return x//gcd(x,y)*y
 5 def dfs(x,y):
 6     if(vis[x]):
 7         return y
 8     vis[x] = 1
 9     return dfs(c[x-1],y+1)
10 n =int(input())
11 c = []
12 for x in input().split():
13     c.append(int(x))
14 vis = [0]*(n+1)
15 ind = [0]*(n+1)
16 for i in range(n):
17     ind[i+1]+=1
18     ind[c[i]]+=1
19 mk = 1
20 for i in range(n):
21     if(ind[i+1]&1):
22         mk = 0
23 ans = 1
24 if(mk):
25     for i in range(n):
26         if(vis[i+1]==0):
27             val = dfs(i+1,0)
28         if(val%2==0):
29             val//=2
30         ans = lcm(ans,val)
31     print(ans)
32 else:
33     print("-1");
View Code

 

D. Arpa's weak amphitheater and Mehrdad's valuable Hoses

约妹纸,要么约集合,要么约集合中的一个(可用list优化) 并查集加01背包

但是问题来了...这个题做了整整五个小时没A...................  TLE到死         python的多重循环比C++慢百倍....怪不得DE这种题一般没python的出现.... 

优化了range  继续TLE  直到现在  我放弃了 

虽然红了两页  但是学到了不少....蛮阿Q的...

n, m, w = map(int, input().split())
W = []
B = []
W = list(map(int, input().split()))
B = list(map(int, input().split()))
par = [0]*(n+10)
for i in range(0, n):par[i] = i
def find(x):if(x == par[x]):return xelse:par[x] = find(par[x])return par[x]
def unite(x, y):x = find(x)y = find(y)if(x != y):par[x] = y
for i in range(m):x, y = map(int, input().split())unite(x-1, y-1)
dp = [0]*(w+10)
q = [0]*(n+10)
for i in range(n):if(i==find(i)):cnt = 0V = 0E = 0for k in range(n):if(find(k)==find(i)):q[cnt] = kcnt += 1V += W[k]E += B[k]for j in range(w,-1,-1):if(j>=V):dp[j] = max(dp[j],dp[j-V]+E)for k in range(cnt):if(j>=W[q[k]]):dp[j] = max(dp[j],dp[j-W[q[k]]]+B[q[k]])
print(dp[w])
理论AC代码

后来去CF上拿了份代码  把python翻译成C++   就AC了

#include
#include
using namespace std;
int n,m,w,cnt;
int fa[1100],a[1100],b[1100],f[1100],q[1100];
int find(int x)
{if(!fa[x]) return x;fa[x]=find(fa[x]);return fa[x];
}
int main()
{int i,r1,r2,j,k;scanf("%d%d%d",&n,&m,&w);for(i=1;i<=n;i++) scanf("%d",&a[i]);for(i=1;i<=n;i++) scanf("%d",&b[i]);for(i=1;i<=m;i++){scanf("%d%d",&r1,&r2);j=find(r1); k=find(r2);if(j!=k)fa[k]=j;}for(i=1;i<=n;i++) if(fa[i]==0){cnt=0; int ww=0,bb=0;for(j=1;j<=n;j++) if(find(j)==i) {q[++cnt]=j; ww+=a[j]; bb+=b[j];}for(j=w;j>=0;j--) {//f[i][j]=f[i-1][j];for(k=1;k<=cnt;k++) if(j>=a[q[k]]) f[j]=max(f[j],f[j-a[q[k]]]+b[q[k]]);if(j>=ww) f[j]=max(f[j],f[j-ww]+bb);}} printf("%d",f[w]);return 0;
}
AC代码

待补
E.

F.

 

 

 

转载于:https://www.cnblogs.com/Geek-xiyang/p/6145092.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部