20140710总结

  今天第一题很水,主要坑在负数上,不多说,上代码。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 long long N,K;
 6 long long a[1000000];
 7 long long flags[1000000];
 8 int main()
 9 {
10     scanf("%I64d%I64d",&N,&K);
11     memset(a,0,sizeof(a));
12     memset(flags,0,sizeof(flags));
13     for(int i=1;i<=N;i++)
14     {
15         scanf("%I64d",&a[i]);
16         a[i]=(a[i]+a[i-1])%K;
17         while(a[i]<0)
18             a[i]+=K;
19         a[i]%=K;
20     }
21     for(int i=0;i<=N;i++)
22         flags[a[i]%K]++;
23     long long ans=0;
24     for(int i=0;i<K;i++)
25         ans+=max(0LL,flags[i]*(flags[i]-1)/2);
26     printf("%I64d\n",ans);
27 }
View Code

  今天第二题,二分答案+spfa找负环。思路很清晰,大意就是因为直接找简单回路要记录有哪些点走了,走了那些边。于是考虑二分答案,判合法,判的方法是:减掉答案,如果存在一条回路使答案<=0,那么答案一定合法。这让人想到了负环(其实是非正环)。做法是spfa,如果dis[to]>=dis[now]+len; (注意“=”很重要)能一直更新(更新了点数次以上),那么说明有负环。

  我当场之所以WA40,后来查错,才发现是INF开小了!!!!!洗内!!!!!!

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 using namespace std;
 6 struct JackSlowFuck
 7 {
 8     int from,to,len,next;
 9 }Fu[1010];
10 int node[610];
11 int now;
12 double dis[610];
13 bool in[610];
14 int N,M,f,t,l;
15 int cs[610];
16 void addedge(int f,int t,int l)
17 {
18     Fu[++now].next=node[f];
19     node[f]=now;
20     Fu[now].to=t;
21     Fu[now].len=l;
22 }
23 bool spfa(int s,double ch)
24 {
25     for(int i=1;i<=N;i++)
26         dis[i]=100000000.0;
27     memset(cs,0,sizeof(cs));
28     memset(in,0,sizeof(in));
29     dis[s]=0.0;
30     queue <int> Q;
31     Q.push(s);
32     while(!Q.empty())
33     {
34         int nn=Q.front();
35         Q.pop();
36         cs[nn]++;
37         if(cs[nn]>N+10)
38             return true;
39         in[nn]=false;
40         for(int k=node[nn];k;k=Fu[k].next)
41         {
42             if(dis[Fu[k].to]>=dis[nn]+Fu[k].len-ch)
43             {
44                 dis[Fu[k].to]=dis[nn]+Fu[k].len-ch;
45                 if(!in[Fu[k].to])
46                 {
47                     in[Fu[k].to]=true;
48                     Q.push(Fu[k].to);
49                 }
50             }
51         }
52     }
53     return false;
54 }
55 int main()
56 {
57     scanf("%d%d",&N,&M);
58     for(int i=1;i<=M;i++)
59     {
60         scanf("%d%d%d",&f,&t,&l);
61         addedge(f,t,l);
62     }
63     double l=0.0,r=10000000.0;
64     while(r-l>0.00001)
65     {
66         double mid=(l+r)/2;
67         if(spfa(1,mid))
68             r=mid;
69         else
70             l=mid;
71     }
72     printf("%.2lf\n",r);
73 }
View Code

  第三题不会。

转载于:https://www.cnblogs.com/JackSlowFuck/p/3836558.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值