Codeforces Round #216 (Div. 2)

来源:互联网 发布:淘宝入门知识 编辑:程序博客网 时间:2024/06/05 21:04

500pt:

题目连接:http://codeforces.com/problemset/problem/369/A

思路:直接贪心,注意一次只能洗一只碗,一开始以为洗一次能把所有都洗好。。。

代码:

#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>#include <string.h>#include <queue>using namespace std;#define ll long longint n,m,k;int input[1010];int main(){    while(cin>>n>>m>>k)    {        for(int i=0;i<n;i++)            cin>>input[i];        int tempm = m;        int tempk = k;        int wash = 0;        for(int i=0;i<n;i++)        {            if(input[i]==1)            {                if(tempm>0)                    tempm--;                else                {                    wash++;                }            }            else            {                if(tempk>0)                    tempk--;                else if(tempm>0)                    tempm--;                else                {                    wash++;                }            }        }        cout<<wash<<endl;    }    return 0;}

1000pt:

题目链接:http://codeforces.com/problemset/problem/369/B

思路:对于前k个,先全部赋值r,在根据sk逐个减1,对后面部分,先全部赋值l,再根据sall-sk逐个加1(比赛时写的比较繁琐,貌似可以直接赋值sk,sall-sk的平均值,再+-1来做)

代码:

#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>#include <string.h>#include <queue>using namespace std;#define ll long longint n,k,l,r,sall,sk;int input[1010];int main(){    while(cin>>n>>k>>l>>r>>sall>>sk)    {        for(int i=1;i<=n;i++)        {            if(i<=k)                input[i] = r;            else                input[i] = l;        }        int tempk = r*k-sk;        if(tempk>k)        {            int t = tempk/k;            for(int i=1;i<=k;i++)            {                input[i]-=t;            }            tempk%=k;        }        for(int i=1;i<=tempk;i++)        {            input[i]--;        }        int tempn = sall-sk - (n-k)*l;        if(n!=k)        {            int t = tempn/(n-k);            int rest = tempn-t*(n-k);            for(int i=k+1;i<=n;i++)                input[i]+=t;            for(int i=k+1;i<k+1+rest;i++)                input[i]++;        }        for(int i=1;i<=n;i++)            cout<<input[i]<<" ";        cout<<endl;    }    return 0;}

1500pt:

题目链接:http://codeforces.com/problemset/problem/369/C

分析:此题在于构建一棵树,用多个vector数组来记录,然后采用dfs()遍历就行,如果某个节点即其各个子节点都不需要修理,并且它到父节点的权值为2,那么该节点是要修理的。

代码:

#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>#include <string.h>#include <queue>#include <map>#include <algorithm>using namespace std;#define ll long longconst int N=100010;int n,from,to,type;vector<int > ok[N],path[N],v;bool dfs(int cur,int parent){bool needToRepair = 0;for(int i=0;i<path[cur].size();i++){int next = path[cur][i];if(next!=parent){bool nextNeedtoRepair = dfs(next,cur);if(!nextNeedtoRepair&&ok[cur][i]){v.push_back(next);needToRepair = true;}if(nextNeedtoRepair)needToRepair= true;}}return needToRepair;}int main(){cin>>n;for(int i=1;i<=n-1;i++){cin>>from>>to>>type;path[from].push_back(to);path[to].push_back(from);ok[from].push_back(type-1);ok[to].push_back(type-1);}dfs(1,-1);cout<<v.size()<<endl;for(int i=0;i<v.size();i++)cout<<v[i]<<" ";cout<<endl;return 0;}