题目连接:http://codeforces.com/contest/448

A:给你一些奖杯与奖牌让你推断能不能合法的放在给定的架子上。假设能够就是YES否则就是NO。

<span style="font-size:18px;">#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-12
///#define M 1000100
///#define LL __int64
#define LL long long
///#define INF 0x7ffffff
#define INF 0x3f3f3f3f
#define PI 3.1415926535898
#define zero(x) ((fabs(x)<eps)?0:x) using namespace std; const int maxn = 100010; int num[maxn]; int main()
{
int a1, a2, a3;
int b1, b2, b3;
int n;
while(cin >>a1)
{
cin >>a2>>a3;
cin >>b1>>b2>>b3;
cin >>n;
int sum1 = 0;
sum1 += a1;
sum1 += a2;
sum1 += a3;
int sum2 = 0;
sum2 += b1;
sum2 += b2;
sum2 += b3;
int x = sum1/5;
if(sum1%5) x++;
int y = sum2/10;
if(sum2%10) y++;
if(x+y<= n) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}</span>

B:给你两个字符串,推断假设让s串变成t串须要什么操作。

假设仅仅是删除一些字母就能够得到输出:automaton。假设仅仅是通过调换字母的顺序就输出:array。如既要删除字母又要调换顺序输出:both。假设须要加入新的字母输出:need tree。

#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-12
///#define M 1000100
///#define LL __int64
#define LL long long
///#define INF 0x7ffffff
#define INF 0x3f3f3f3f
#define PI 3.1415926535898
#define zero(x) ((fabs(x)<eps)?0:x) using namespace std; const int maxn = 110; char s1[maxn];
char s2[maxn];
int vis[maxn];
int num[maxn]; int main()
{
while(cin >>s1)
{
cin >>s2;
int len1 = strlen(s1);
int len2 = strlen(s2);
memset(vis, 0, sizeof(vis));
memset(num, 0, sizeof(num));
for(int i = 0; i < len1; i++) vis[s1[i]-'a']++;
int flag1 = 0;
for(int i = 0; i < (len1-len2); i++)
{
int flag = 0;
for(int j = 0; j < len2; j++)
{
if(s1[i+j] != s2[j])
{
flag = 1;
break;
}
}
if(!flag)
{
flag1 = 1;
break;
}
}
int flag2 = 0;
for(int i = 0; i < len2; i++) num[s2[i]-'a']++;
for(int i = 0; i < 26; i++)
{
if(num[i] > vis[i])
{
flag2 = 1;
break;
}
}
if(flag2) cout<<"need tree"<<endl;
else if(flag1) cout<<"automaton"<<endl;
else if(len1 == len2 && !flag2) cout<<"array"<<endl;
else
{
int top = 0;
for(int i = 0; i < len1; i++) if(s1[i] == s2[top]) top++;
if(top == len2) cout<<"automaton"<<endl;
else cout<<"both"<<endl;
}
}
}

C给你一串数字代表木板的高度,每块木板的宽度都为1。

让你算出最少须要多少次能够把木板染完颜色。染得时候能够每次染长度为1的一横行(能够多个连续的木板)或者能够竖着然这个一块木板。每一个木板能够反复染色。

思路是:dp[i][j]表示染到第i块木板的时候染了j次横的。

须要注意的是要从后向前的dp。

#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-12
///#define M 1000100
///#define LL __int64
#define LL long long
///#define INF 0x7ffffff
#define INF 0x3f3f3f3f
#define PI 3.1415926535898
#define zero(x) ((fabs(x)<eps)?0:x) using namespace std; const int maxn = 5010;
int dp[maxn][maxn];
int num[maxn];
int main()
{
int n;
while(cin >>n)
{
num[0] = 0;
for(int i = 1; i <= n; i++) scanf("%d",&num[i]);
for(int i = 0; i <= n; i++) dp[n][i] = 0;
for(int i = n; i >= 1; i--)
{
for(int j = 0; j < i; j++)
{
if(num[i] <= num[j])
{
dp[i-1][j] = dp[i][i];
continue;
}
dp[i-1][j] = min(dp[i][j]+1, dp[i][i]+num[i]-num[j]);
} }
cout<<dp[0][0]<<endl;
}
return 0;
}

D给你n。m,k。n*m的矩阵中的每一个元素是i,j的成绩。然后让你求一个x满足在这个n*m的矩阵中有k个元素小于x。

思路二分枚举x,范围是1-n*m。

可是这里要高速求出小于x的数的个数。

for(int i = 1; i <= n; i++) ans += min(m, mid/i);这个能够高速的统计出这一行中有多少个元素是小于x的。

#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-12
///#define M 1000100
///#define LL __int64
#define LL long long
///#define INF 0x7ffffff
#define INF 0x3f3f3f3f
#define PI 3.1415926535898
#define zero(x) ((fabs(x)<eps)?0:x) using namespace std; const int maxn = 5010;
int dp[maxn][maxn];
int num[maxn];
int main()
{
LL n, m, k;
while(cin >>n>>m>>k)
{
LL l = 1;
LL r = n*m;
while(l < r)
{
LL mid = (l+r)>>1;
LL ans = 0;
for(int i = 1; i <= n; i++) ans += min(m, mid/i);
if(ans >= k) r = mid;
else if(ans < k) l = mid+1;
}
cout<<r<<endl;
}
}

最新文章

  1. Ubuntu搭建NFS
  2. 【2014-05-06】C++ 设计模式----单例模式
  3. EntityFrameWork使用MySql数据库分页的BUG
  4. style=&quot;visibility: hidden&quot; 和 style=“display:none”区别
  5. Swift开发学习-03 Swift技巧
  6. alias function varibales in Linux/GNU and Mac alias命令细说
  7. JSP动作学习一
  8. 线程本地变量ThreadLocal
  9. simplify the life ECMAScript 5(ES5)中bind方法简介
  10. 14.TCP的坚持定时器和保活定时器
  11. Javascript的内容
  12. 第26章 联合注销 - Identity Server 4 中文文档(v1.0.0)
  13. selenium使用技巧
  14. K2在Gartner 2017 iBPMS魔力象限报告中上升为“挑战者”
  15. flask中自定义过滤器
  16. python 2.X 和 3.X 的区别汇总
  17. iOS-项目开发1-Block
  18. Android ListView CheckBox状态错乱(转)
  19. 结队第二次作业——WordCount进阶需求
  20. Shell下syntax error: operand expected (error token is “-”)

热门文章

  1. Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) A. Little Artem and Presents 水题
  2. hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并
  3. ROS知识(5)----消息与服务的示例
  4. 在VIEW引入CSS、JS文件
  5. 创建Server(tomcat)时候报Cannot create a server using the selected type
  6. External components provide true shutdown for boost converter
  7. 安装完Framework后如何不重启系统?
  8. win7 64位搭建scrapy(转)
  9. gpu和cpu区别
  10. C语言之动态分配内存