Problem A Valera and Plates
有碗和碟子两种容器,小明每天吃一种食物,食物有两种1只能用碗吃2两个容器都可。给你初始的碗与碟子问小明至少要洗多少个碗或碟子。
简单模拟,能用碟子就用碟子。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 #include <vector> 8 #include <queue> 9 #include <stack> 10 #define INF 0x7fffffff 11 12 using namespace std; 13 14 int main() 15 { 16 // freopen("in.txt", "r", stdin); 17 18 int n, m, k, a, b; 19 while(scanf("%d%d%d", &n, &m, &k)!=EOF){ 20 a = b = 0;int ans = 0; 21 for(int i=0; i<n; i++){ 22 int temp; 23 scanf("%d", &temp); 24 if(temp==1){ 25 if(m)m--; 26 else ans++; 27 }else{ 28 if(k)k--; 29 else if(m)m--; 30 else ans++; 31 } 32 } 33 printf("%d ", ans); 34 } 35 return 0; 36 }
Problem B Valera and Contest
有一个非减序列有n个元素每个元素都在【l,r】之间,告诉你前k个和为sk总和为sn让你输出一种序列的可能情况。
贪心,对于前k个最小值一定固定为sk/k剩下的值在前面sk%k上加一即可。对于后面n-k个一样处理。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 #include <vector> 8 #include <queue> 9 #include <stack> 10 #define INF 0x7fffffff 11 12 using namespace std; 13 14 int main() 15 { 16 // freopen("in.txt", "r", stdin); 17 18 int n, k, l ,r, sa, sk; 19 int ans[10100]; 20 while(cin >> n >> k >> l >> r >> sa >> sk){ 21 for(int i=0; i<k; i++){ 22 ans[i] = sk/k; 23 } 24 for(int i=0; i<sk%k; i++){ 25 ans[i] ++; 26 } 27 if(n!=k){ 28 for(int i=k; i<n; i++){ 29 ans[i] = (sa-sk)/(n-k); 30 } 31 for(int i=k; i<k+(sa-sk)%(n-k); i++){ 32 ans[i]++; 33 } 34 } 35 for(int i=0; i<n; i++){ 36 printf("%d", ans[i]); 37 if(i!=n-1)cout << ' '; 38 } 39 cout << endl; 40 } 41 return 0; 42 }
Problem C Valera and Elections
简单树形DP,思路超简单为什么比赛的时候没有想到0.0
dp[root] = sum(dp[k])k为所有儿子
当root所有的儿子都没有标记且root至其根节点的路是坏的时候把root标记一下。最后dfs返回值即为答案数目。
vis数组即为序列。
代码如下:
1 #include <iostream> 2 #include <fstream> 3 #include <cstdio> 4 #include <cstring> 5 #include <cstdlib> 6 #include <cmath> 7 #include <algorithm> 8 #include <utility> 9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #define INF 0x7fffffff 13 #define LEN 101000 14 #define ll long long 15 #define eps 1E-6 16 17 using namespace std; 18 19 vector<pair<int,int> > Map[LEN]; 20 int n, vis[LEN], vv[LEN]; 21 22 int DFS(int root, int fa) 23 { 24 int ret = 0, flag = 1; 25 for(int i=0; i<Map[root].size(); i++){ 26 // if(vv[i])continue; 27 // vv[i] = 1; 28 if(Map[root][i].first==fa){ 29 flag = Map[root][i].second; 30 continue; 31 } 32 ret+=DFS(Map[root][i].first, root); 33 } 34 if(ret==0 && flag==2)return vis[root]=1; 35 return ret; 36 } 37 38 int main() 39 { 40 // freopen("in.txt", "r", stdin); 41 while(scanf("%d", &n)!=EOF){ 42 memset(vis, 0, sizeof vis); 43 memset(vv, 0, sizeof vv); 44 for(int i=0; i<LEN; i++)Map[i].clear(); 45 for(int i=1; i<n; i++){ //build Map 46 int a, b, val; 47 scanf("%d%d%d", &a, &b, &val); 48 Map[a].push_back(make_pair(b, val)); 49 Map[b].push_back(make_pair(a, val)); 50 } 51 int ans = DFS(1, -1); 52 printf("%d", ans); 53 for(int i=1; i<=n; i++){ 54 if(vis[i]){ 55 printf(" %d", i); 56 } 57 } 58 printf(" "); 59 } 60 return 0; 61 }