DIV1 250pt

题意:每天晚上需要点蜡烛,且每晚蜡烛燃烧1cm,第i天晚上需要点i根蜡烛。第一天白天的时候,拥有一些蜡烛,用vector<int>can表示他们的长度,问最多能烧几个晚上。

解法:模拟+贪心,每次烧长度最长的k支蜡烛即可。

tag:simulation, greedy

 // BEGIN CUT HERE
/*
* Author: plum rain
* score :
*/
/* */
// END CUT HERE
#line 11 "OlympicCandles.cpp"
#include <sstream>
#include <stdexcept>
#include <functional>
#include <iomanip>
#include <numeric>
#include <fstream>
#include <cctype>
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <set>
#include <queue>
#include <bitset>
#include <list>
#include <string>
#include <utility>
#include <map>
#include <ctime>
#include <stack> using namespace std; #define clr0(x) memset(x, 0, sizeof(x))
#define clr1(x) memset(x, -1, sizeof(x))
#define pb push_back
#define sz(v) ((int)(v).size())
#define all(t) t.begin(),t.end()
#define zero(x) (((x)>0?(x):-(x))<eps)
#define out(x) cout<<#x<<":"<<(x)<<endl
#define tst(a) cout<<a<<" "
#define tst1(a) cout<<#a<<endl
#define CINBEQUICKER std::ios::sync_with_stdio(false) typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<double> vd;
typedef pair<int, int> pii;
typedef long long int64; const double eps = 1e-;
const double PI = atan(1.0)*;
const int inf = / ; bool cmp(int a, int b)
{
return a > b;
} class OlympicCandles
{
public:
int numberOfNights(vector <int> can){
int ans = ;
while (ans <= ){
if (ans > sz(can)) return sz(can);
sort(all(can), cmp);
for (int i = ; i < ans; ++ i){
if (can[i]) can[i] --;
else return ans - ;
}
++ ans;
}
return ans;
} // BEGIN CUT HERE
public:
void run_test(int Case) { if ((Case == -) || (Case == )) test_case_0(); if ((Case == -) || (Case == )) test_case_1(); if ((Case == -) || (Case == )) test_case_2(); if ((Case == -) || (Case == )) test_case_3(); if ((Case == -) || (Case == )) test_case_4(); }
private:
template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '\"' << *iter << "\","; os << " }"; return os.str(); }
void verify_case(int Case, const int &Expected, const int &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: \"" << Expected << '\"' << endl; cerr << "\tReceived: \"" << Received << '\"' << endl; } }
void test_case_0() { int Arr0[] = {, , }; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[]))); int Arg1 = ; verify_case(, Arg1, numberOfNights(Arg0)); }
void test_case_1() { int Arr0[] = {, , , }; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[]))); int Arg1 = ; verify_case(, Arg1, numberOfNights(Arg0)); }
void test_case_2() { int Arr0[] = {, , , }; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[]))); int Arg1 = ; verify_case(, Arg1, numberOfNights(Arg0)); }
void test_case_3() { int Arr0[] = {, , , , , }; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[]))); int Arg1 = ; verify_case(, Arg1, numberOfNights(Arg0)); }
void test_case_4() { int Arr0[] = {, , , , , , , , , , }; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[]))); int Arg1 = ; verify_case(, Arg1, numberOfNights(Arg0)); } // END CUT HERE }; // BEGIN CUT HERE
int main()
{
// freopen( "a.out" , "w" , stdout );
OlympicCandles ___test;
___test.run_test(-);
return ;
}
// END CUT HERE

DIV1 500pt

题意:做一个游戏,在一个无向图上,每个点上有一些糖果,每次可以选择任意一个糖果数大等于2的点i,拿出其中两个糖果,吃掉一个,将剩下的一个放在i点的一个相邻点上。初始时,每个点上有一些糖果,有一个特定点k,要求无论如何操作,都不能使k点出现有且仅有一个糖果的情况,问初始时图上最多有多少个糖果。如果可以有多余2*10^9个糖果,直接输出-1。

解法:首先,若图不联通,则可以放无数糖果,输出-1。

   考虑末态,要使糖果数量最多,末态肯定为除了k点,每个点一个糖果。考虑末态向初态转移。将无向图转化成以k点为根的树,则每个父亲节点的1个糖果可以有它的某个子节点的两个糖果变出来,所以,应该尽量将所有糖果都放在非叶子节点。下面考虑,从树的顶端把所有糖果放回底端,即是考虑这个游戏的逆过程。

   如果某个父亲节点仅有一个子节点,直接将父亲节点的k个糖果变为子节点的2*k个糖果即可。若父亲节点有多个子节点,有两种处理方式,父亲节点的k个糖果均由一个某一个子节点转移得到,或者由多个子节点转移得到。显然,前者更优。那么,要选择哪个子节点呢?子树深度最深的那个自己子节点。

   至此,问题得到完整解决。这是一道想法非常自然,而且所用结论均为简单贪心的题,稍微想一下即可明白。

tag:greedy, tree

 // BEGIN CUT HERE
/*
* Author: plum rain
* score :
*/
/* */
// END CUT HERE
#line 11 "CandyGame.cpp"
#include <sstream>
#include <stdexcept>
#include <functional>
#include <iomanip>
#include <numeric>
#include <fstream>
#include <cctype>
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <set>
#include <queue>
#include <bitset>
#include <list>
#include <string>
#include <utility>
#include <map>
#include <ctime>
#include <stack> using namespace std; #define clr0(x) memset(x, 0, sizeof(x))
#define clr1(x) memset(x, -1, sizeof(x))
#define pb push_back
#define sz(v) ((int)(v).size())
#define all(t) t.begin(),t.end()
#define zero(x) (((x)>0?(x):-(x))<eps)
#define out(x) cout<<#x<<":"<<(x)<<endl
#define tst(a) cout<<a<<" "
#define tst1(a) cout<<#a<<endl
#define CINBEQUICKER std::ios::sync_with_stdio(false) typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<double> vd;
typedef pair<int, int> pii;
typedef long long int64; const double eps = 1e-;
const double PI = atan(1.0)*;
const int inf = / ;
const int maxx = ; class CandyGame
{
public:
vs g;
int64 ans;
vi son[];
int64 an[];
int len[];
bool v[]; void dfs (int tar)
{
len[tar] = ; v[tar] = ;
for (int i = ; i < sz(g); ++ i)
if (g[i][tar] == 'Y' && !v[i]){
son[tar].pb (i);
dfs (i);
len[tar] = max(len[tar], len[i]);
}
++ len[tar];
} void gao(int tar, int64 num)
{
bool ok = ;
an[tar] = num > maxx ? - : num;
for (int i = ; i < sz(son[tar]); ++ i){
if (ok || len[son[tar][i]]+ != len[tar])
gao (son[tar][i], );
else
ok = , gao (son[tar][i], *num> ? *num : ); if (an[tar] != -){
if(an[son[tar][i]] == -) an[tar] = -;
else an[tar] += an[son[tar][i]]; if (an[tar] > maxx) an[tar] = -;
}
}
} int maximumCandy(vector <string> G, int tar){
g = G;
clr0 (v);
for (int i = ; i < sz(g); ++ i) son[i].clear();
dfs (tar);
for (int i = ; i < sz(g); ++ i) if (!v[i]) return -;
if (sz(g) == ) return ;
if (sz(g) == ) return ;
gao(tar, );
return an[tar];
} // BEGIN CUT HERE
public:
void run_test(int Case) { if ((Case == -) || (Case == )) test_case_0(); if ((Case == -) || (Case == )) test_case_1(); if ((Case == -) || (Case == )) test_case_2(); if ((Case == -) || (Case == )) test_case_3(); if ((Case == -) || (Case == )) test_case_4(); if ((Case == -) || (Case == )) test_case_5(); }
//void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_1();}
private:
template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '\"' << *iter << "\","; os << " }"; return os.str(); }
void verify_case(int Case, const int &Expected, const int &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: \"" << Expected << '\"' << endl; cerr << "\tReceived: \"" << Received << '\"' << endl; } }
void test_case_0() { string Arr0[] = {"NYN", "YNY", "NYN"}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[]))); int Arg1 = ; int Arg2 = ; verify_case(, Arg2, maximumCandy(Arg0, Arg1)); }
void test_case_1() { string Arr0[] = {"NYN", "YNY", "NYN"}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[]))); int Arg1 = ; int Arg2 = ; verify_case(, Arg2, maximumCandy(Arg0, Arg1)); }
void test_case_2() { string Arr0[] = {"NYYY", "YNNN", "YNNN", "YNNN"}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[]))); int Arg1 = ; int Arg2 = ; verify_case(, Arg2, maximumCandy(Arg0, Arg1)); }
void test_case_3() { string Arr0[] = {"NYYY", "YNNN", "YNNN", "YNNN"}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[]))); int Arg1 = ; int Arg2 = ; verify_case(, Arg2, maximumCandy(Arg0, Arg1)); }
void test_case_4() { string Arr0[] = {"NYNNNYN",
"YNYNYNN",
"NYNYNNN",
"NNYNNNN",
"NYNNNNN",
"YNNNNNY",
"NNNNNYN"}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[]))); int Arg1 = ; int Arg2 = ; verify_case(, Arg2, maximumCandy(Arg0, Arg1)); }
void test_case_5() { string Arr0[] = {"NYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN",
"YNYNNNNNNNNNNNNNNNNNNNNNNNNNNNNN",
"NYNYNNNNNNNNNNNNNNNNNNNNNNNNNNNN",
"NNYNYNNNNNNNNNNNNNNNNNNNNNNNNNNN",
"NNNYNYNNNNNNNNNNNNNNNNNNNNNNNNNN",
"NNNNYNYNNNNNNNNNNNNNNNNNNNNNNNNN",
"NNNNNYNYNNNNNNNNNNNNNNNNNNNNNNNN",
"NNNNNNYNYNNNNNNNNNNNNNNNNNNNNNNN",
"NNNNNNNYNYNNNNNNNNNNNNNNNNNNNNNN",
"NNNNNNNNYNYNNNNNNNNNNNNNNNNNNNNN",
"NNNNNNNNNYNYNNNNNNNNNNNNNNNNNNNN",
"NNNNNNNNNNYNYNNNNNNNNNNNNNNNNNNN",
"NNNNNNNNNNNYNYNNNNNNNNNNNNNNNNNN",
"NNNNNNNNNNNNYNYNNNNNNNNNNNNNNNNN",
"NNNNNNNNNNNNNYNYNNNNNNNNNNNNNNNN",
"NNNNNNNNNNNNNNYNYNNNNNNNNNNNNNNN",
"NNNNNNNNNNNNNNNYNYNNNNNNNNNNNNNN",
"NNNNNNNNNNNNNNNNYNYNNNNNNNNNNNNN",
"NNNNNNNNNNNNNNNNNYNYNNNNNNNNNNNN",
"NNNNNNNNNNNNNNNNNNYNYNNNNNNNNNNN",
"NNNNNNNNNNNNNNNNNNNYNYNNNNNNNNNN",
"NNNNNNNNNNNNNNNNNNNNYNYNNNNNNNNN",
"NNNNNNNNNNNNNNNNNNNNNYNYNNNNNNNN",
"NNNNNNNNNNNNNNNNNNNNNNYNYNNNNNNN",
"NNNNNNNNNNNNNNNNNNNNNNNYNYNNNNNN",
"NNNNNNNNNNNNNNNNNNNNNNNNYNYNNNNN",
"NNNNNNNNNNNNNNNNNNNNNNNNNYNYNNNN",
"NNNNNNNNNNNNNNNNNNNNNNNNNNYNYNNN",
"NNNNNNNNNNNNNNNNNNNNNNNNNNNYNYNN",
"NNNNNNNNNNNNNNNNNNNNNNNNNNNNYNYN",
"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNYNY",
"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNYN"}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[]))); int Arg1 = ; int Arg2 = -; verify_case(, Arg2, maximumCandy(Arg0, Arg1)); } // END CUT HERE }; // BEGIN CUT HERE
int main()
{
//freopen( "a.out" , "w" , stdout );
CandyGame ___test;
___test.run_test(-);
return ;
}
// END CUT HERE

SRM 408(1-250pt, 1-500pt)的更多相关文章

  1. SRM475 - SRM479(1-250pt,500pt)

    SRM 475 DIV1 300pt 题意:玩游戏.给一个棋盘,它有1×n(1行n列,每列标号分别为0,1,2..n-1)的格子,每个格子里面可以放一个棋子,并且给定一个只含三个字母WBR,长度为n的 ...

  2. SRM468 - SRM469(1-250pt, 500pt)

    SRM 468 DIV1 250pt 题意:给出字典,按照一定要求进行查找. 解法:模拟题,暴力即可. tag:water score: 0.... 这是第一次AC的代码: /* * Author: ...

  3. SRM470 - SRM474(1-250pt,500pt)(471-500pt为最短路,474-500pt未做)

    SRM 470 DIV1 250pt 题意:有n个房间排成一排,相邻两个房间之间有一扇关闭着的门(共n-1扇),每个门上都标有‘A’-‘P’的大写字母.给定一个数n,表示第n个房间.有两个人John和 ...

  4. SRM593(1-250pt,500pt)

    SRM 593 DIV1 250pt 题意:有如下图所示的平面,每个六边形有坐标.将其中一些六边形染色,要求有边相邻的两个六边形不能染同一种颜色.给定哪些六边形需要染色,问最少需要多少种颜色. 解法: ...

  5. topcoder srm 553

    div1 250pt: 题意:... 解法:先假设空出来的位置是0,然后模拟一次看看是不是满足,如果不行的话,我们只需要关心最后栈顶的元素取值是不是受空白处的影响,于是还是模拟一下. // BEGIN ...

  6. topcoder srm 552

    div1 250pt: 题意:用RGB三种颜色的球摆N层的三角形,要求相邻的不同色,给出RGB的数量,问最多能摆几个 解法:三种颜色的数量要么是全一样,要么是两个一样,另外一个比他们多一个,于是可以分 ...

  7. topcoder srm 551

    div1 250pt 题意:一个长度最多50的字符串,每次操作可以交换相邻的两个字符,问,经过最多MaxSwaps次交换之后,最多能让多少个相同的字符连起来 解法:对于每种字符,枚举一个“集结点”,让 ...

  8. topcoder srm 550

    div1 250pt: 题意:有个机器人,从某一点出发,他只有碰到地形边缘或者碰到走过的点时才会改变运动方向,然后接着走,现在给出他的运动轨迹,判断他的运动是否合法,如果合法的话,那么整个地形的最小面 ...

  9. topcoder srm 610

    div1 250pt: 题意:100*100的01矩阵,找出来面积最大的“类似国际象棋棋盘”的子矩阵. 解法:枚举矩阵宽(水平方向)的起点和终点,然后利用尺取法来找到每个固定宽度下的最大矩阵,不断更新 ...

随机推荐

  1. 使用openrowset跨库查询

    --insert fj_studentinfo--select *--from--  openrowset('SQLOLEDB','localhost';'sa';'password',dbname. ...

  2. Mysql DB2等数据库分页的实现

    一.Mysql的分页 (一).MySQL分页的实现,使用关键字:Limit    语法:select * from tableName Limit A,B; 注释:tableName:表名 A:查询的 ...

  3. O-C相关-03:面向对象概念的具体介绍

    1.面向对象的概念 面向对象(object-oriented ;简称: OO) 至今还没有统一的概念,我这里把它定义为:按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世 ...

  4. Windows7 QT5.6.0(64位)使用mysql(64位)环境搭建详解

    1 说明 使用环境为:Windows7 VS2015 QT5.6.0(64位),MYSQL 5.7.13(64位). 网上各种错误.模糊.抽象的资料,配置环境花了半天,痛定思痛,总结出来,方便后来人. ...

  5. vs2013 使用vs调试器,发现调试器显示的数据错误。查看内存,发现内存是正确的。

    有可能只是调试器的问题,程序可以正常运行的! 网上没找到此种情况解释.感觉有可能是那里堆被破坏了.

  6. C++常量的引用 const

    如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作.对C++常量引用可以用其它任何引用来初始化:但不能改变. 关于引用的初始化 ...

  7. JS-SDK微信支付开发攻略

    一.吐槽篇 一个字——坑!两个字——很坑!三个字——非常坑!首先,微信支付接口作为微信开发接口的一部分,竟然有一本书那么厚的官方文档,共36页,更重要的是,这36页还不能把开发的流程说清楚,描述过于分 ...

  8. DevExpress GridControl 中下拉框联动效果的实现(及支持文本框录入情况)

    先解释一下标题: grid中的某一列默认为文本框,根据需要动态的变更为下拉框,且支持动态变更数据源 需求是这样的: 有一些参数(A),这些参数又分别对应另外的参数(B),所以,先把A作为一列,B根据A ...

  9. 一次 php nusoap 调试过程

    今天跟同事调用一个数据api ,用soap方式调用.本以为很简单的事情,却弄到了晚上. 因为有过调试经验,直接按照以往的过程直接部署,结果是错误. 1. 以为是调用方式错了,问了一下对接的同事,没问题 ...

  10. Android 开机过程PMS分析

    12-13 12:25:05.595 3253 3253 SystemServer !@Boot: Start PackageManagerService pm/PackageManagerServi ...