2015_8

c 统计有几个cool单词,cool的定义就是至少两个字母,每个字母出现的次数都不同。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<set>
 4 #define mt(a,b) memset(a,b,sizeof(a))
 5 using namespace std;
 6 set<int> s;
 7 char a[32];
 8 int b[32];
 9 int test(){
10     mt(b,0);
11     for(int i=0;a[i];i++){
12         b[a[i]-‘a‘]++;
13     }
14     s.clear();
15     int c=0;
16     for(int i=0;i<26;i++){
17         if(b[i]){
18             c++;
19             s.insert(b[i]);
20         }
21     }
22     return s.size()==c&&c>1;
23 }
24 int main(){
25     int n,cas=1;
26     while(~scanf("%d",&n)){
27         int ans=0;
28         while(n--){
29             scanf("%s",a);
30             ans+=test();
31         }
32         printf("Case %d: %d\n",cas++,ans);
33     }
34     return 0;
35 }

d 有向图,两个人从1走到n,问花费之和最小。一条边第一次走花费是d,第二次走花费是d+a。

最小费用最大流 ,两个人相当于流量2,原来一条边变为两条,流量都为1,费用一个d,一个d+a,源点连1,流量2,费用0,n连汇点,流量2,费用0.

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<queue>
  4 #define mt(a,b) memset(a,b,sizeof(a))
  5 using namespace std;
  6 const int inf=0x3f3f3f3f;
  7 class MaxFlowMinCost { ///最小费用最大流 o(ME)
  8     typedef int typef;///流量的类型
  9     typedef int typec;///费用的类型
 10     static const int ME=10010;///边的个数
 11     static const int MV=510;///点的个数
 12     queue<int> q;
 13     int cur[MV],pre[MV];
 14     bool used[MV],sign[MV];
 15     typef flow;
 16     typec cost,dist[MV];
 17     bool spfa(int s,int t) {
 18         mt(used,0);
 19         mt(sign,0);
 20         mt(dist,0);
 21         used[s]=sign[s]=true;
 22         while(!q.empty()) q.pop();
 23         q.push(s);
 24         while(!q.empty()) {
 25             int u=q.front();
 26             q.pop();
 27             used[u]=false;
 28             for(int i=g.head[u]; ~i; i=g.e[i].next) {
 29                 if(g.e[i].flow<1) continue;
 30                 int v=g.e[i].v;
 31                 typec c=g.e[i].cost;
 32                 if(!sign[v]||dist[v]>dist[u]+c) {
 33                     dist[v]=dist[u]+c;
 34                     sign[v]=true;
 35                     pre[v]=u;
 36                     cur[v]=i;
 37                     if(used[v]) continue;
 38                     used[v]=true;
 39                     q.push(v);
 40                 }
 41             }
 42         }
 43         return sign[t];
 44     }
 45     struct G {
 46         struct E {
 47             int v,next;
 48             typef flow;
 49             typec cost;
 50         } e[ME];
 51         int le,head[MV];
 52         void init() {
 53             le=0;
 54             mt(head,-1);
 55         }
 56         void add(int u,int v,typef flow,typec cost) {
 57             e[le].v=v;
 58             e[le].flow=flow;
 59             e[le].cost=cost;
 60             e[le].next=head[u];
 61             head[u]=le++;
 62         }
 63     } g;
 64 public:
 65     void init() {
 66         g.init();
 67     }
 68     void add(int u,int v,typef flow,typec cost) {
 69         g.add(u,v,flow,cost);
 70         g.add(v,u,0,-cost);
 71     }
 72     void solve(int s,int t) {
 73         flow=cost=0;
 74         while(spfa(s,t)) {
 75             int temp=t;
 76             typef now=inf;
 77             while(temp!=s) {
 78                 now=min(now,g.e[cur[temp]].flow);
 79                 temp=pre[temp];
 80             }
 81             flow+=now;
 82             temp=t;
 83             while(temp!=s) {
 84                 int id=cur[temp];
 85                 cost+=now*g.e[id].cost;
 86                 g.e[id].flow-=now;
 87                 g.e[id^1].flow+=now;
 88                 temp=pre[temp];
 89             }
 90         }
 91     }
 92     typef getflow() {
 93         return flow;
 94     }
 95     typec getcost() {
 96         return cost;
 97     }
 98 }g;
 99 int main(){
100     int n,m,u,v,d,a,cas=1;
101     while(~scanf("%d%d",&n,&m)){
102         g.init();
103         while(m--){
104             scanf("%d%d%d%d",&u,&v,&d,&a);
105             g.add(u,v,1,d);
106             g.add(u,v,1,d+a);
107         }
108         int s=0,t=n+1;
109         g.add(s,1,2,0);
110         g.add(n,t,2,0);
111         g.solve(s,t);
112         printf("Case %d: %d\n",cas++,g.getcost());
113     }
114     return 0;
115 }

end

时间: 2024-10-13 23:01:04

2015_8的相关文章