CHD 2015迎新杯题解
简析:计算 n 的二进制表示里面 1 的个数
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int bitcount(int x) {
int ans = ;
while(x) {
if(x & ) ans++;
x >>= ;
}
return ans;
} int main()
{
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout); int T; scanf("%d", &T);
while(T--) {
int n; scanf("%d", &n);
printf("%d\n", bitcount(n));
} return ;
}
参考代码
简析:这个题主要分成四种情况讨论:
一荤一素,两荤两素,一素两荤,一荤两素。
因为不管是饭和汤,还是面条,都会对应上面四种情况,所以我把饭和汤,面条写的一个函数里。
详细见代码,请各位大神指教。----wzm
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a[],b[],c[],d[],e[];
int a1,b1,c1,d1,e1;
int sum[],ans,minn,maxn;
void f(int s){//一饭一汤,面条
for(int x = ; x<=a1; x++){
for(int y = ; y<=b1; y++){
if((s+a[x]+b[y])>=minn&&(s+a[x]+b[y])<=maxn){
ans++;
}
}
}
for(int z = ; z<=c1; z++){
if((s+c[z])>=minn&&(s+c[z])<=maxn){
ans++;
}
}
}
void solve(){
int t;
scanf("%d",&t);
while(t--){
cin>>a1>>b1>>c1>>d1>>e1;
for(int i = ; i<=a1; i++) cin>>a[i];
for(int i = ; i<=b1; i++) cin>>b[i];
for(int i = ; i<=c1; i++) cin>>c[i];
for(int i = ; i<=d1; i++) cin>>d[i];
for(int i = ; i<=e1; i++) cin>>e[i];
cin>>minn>>maxn;
ans = ;
for(int i = ; i<=d1; i++){//一荤一素
for(int j = ; j<=e1; j++){
{
int s = d[i]+e[j];
f(s);
}
}
}
for(int i = ; i<=d1; i++)//两荤两素
for(int j = i+; j<=d1; j++){
for(int p = ; p<=e1; p++){
for(int q = p+; q<=e1; q++){
int s = d[i]+d[j]+e[p]+e[q];
f(s);
}
}
}
for(int i = ; i<=d1; i++){//一荤两素
for(int p = ; p<=e1; p++)
for(int q = p+; q<=e1; q++){
int s = d[i]+e[p]+e[q];
f(s);
}
}
for(int p = ; p<=e1; p++){//两荤一素
for(int i = ;i<=d1; i++){
for(int j = i+; j<=d1; j++){
int s = d[i]+d[j]+e[p];
f(s);
}
}
}
printf("%d\n",ans);
}
}
int main()
{
solve();
return ;
}
wzm
简析:可以先将角度转换为最小的单位的值,再按照题意模拟
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std; struct Node{
int d,m,s;
int x;
}a[]; struct node{
double l;
int id;
}b[]; int cmp(node n1,node n2){
return n1.l < n2.l;
} int sum,vis[],n;
double len[]; void solve(){
int sum0 = (n-)**;
int f = sum - sum0;
if( (long long) f*f > *n){
puts("Poor Prince Cao Tan");
return;
}
f = -f;
int v = f/n;
int r = f%n;
// printf("v = %d r = %d\n",v,r);
memset(vis,,sizeof(vis));
sort(b+,b+n+,cmp);
for(int i = ;i <= n;i++){
int bl,br,jl,jr;
if(b[i].id == n){
bl = ;
br = n-;
jl = ;
jr = n;
}
else if(b[i].id == ){
bl = n;
br = ;
jl = ;
jr = ;
}
else{
bl = b[i].id -;
br = b[i].id +;
jl = b[i].id;
jr = b[i].id+;
}
if(len[bl] > len[br]){
swap(bl,br);
swap(jl,jr);
}
// printf("bl = %d br = %d jl = %d jr = %d\n",bl,br,jl,jr);
if(!vis[jl]){
a[jl].x += v;
if(abs(r)){
a[jl].x += r/abs(r);
int fuhao = r/abs(r);
if(fuhao == -) r++;
else r--;
}
vis[jl] = ;
}
if(!vis[jr]){
a[jr].x += v;
if(abs(r)){
a[jr].x += r/abs(r);
int fuhao = r/abs(r);
if(fuhao == -) r++;
else r--;
}
vis[jr] = ;
}
}
for(int i = ;i <= n;i++){
int c1 = a[i].x/;
int c2 = (a[i].x-c1*)/;
int c3 = a[i].x-c1*-c2*;
a[i].d = c1;a[i].m = c2;a[i].s = c3;
}
for(int i = ;i <= n;i++) printf("%d %d %d\n",a[i].d,a[i].m,a[i].s);
} int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
sum = ;
for(int i = ;i <= n;i++){
scanf("%d %d %d",&a[i].d,&a[i].m,&a[i].s);
a[i].x = a[i].d* + a[i].m*+a[i].s;
sum += a[i].x;
}
for(int i = ;i <= n;i++){
scanf("%lf",&b[i].l);
b[i].id = i;
len[i] = b[i].l;
}
solve();
}
return ;
}
参考代码1
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=;
double L[maxn]; struct angle
{
int d,m,s;
}Zero,One,b[maxn],v[maxn],a[maxn]; angle Plus(angle A,angle B)
{
angle tmp=Zero;
tmp.s=A.s+B.s;
if(tmp.s>=) tmp.s-=,tmp.m++;
tmp.m+=A.m+B.m;
if(tmp.m>=) tmp.m-=,tmp.d++;
tmp.d+=A.d+B.d;
return tmp;
} angle Minus(angle A,angle B)
{
angle tmp;
tmp.s=A.s-B.s;
tmp.m=A.m-B.m;
tmp.d=A.d-B.d;
while(tmp.s<) tmp.s+=,tmp.m--;
while(tmp.m<) tmp.m+=,tmp.d--;
return tmp;
} angle Divide(angle A,int B)
{
angle tmp;
tmp.d=A.d/B;
tmp.m=A.m+A.d%B*;
tmp.s=A.s+tmp.m%B*;
tmp.m/=B;
tmp.s/=B;
return tmp;
} angle Mod(angle A,int B)
{
angle tmp;
tmp.s=(A.d*+A.m*+A.s)%B;
return tmp;
} bool Smaller(angle A,angle B)
{
if(A.d!=B.d) return A.d<B.d;
if(A.m!=B.m) return A.m<B.m;
return A.s<B.s;
} struct point
{
int id;
double x,y;
}p[maxn]; bool cmp(point A,point B)
{
if(A.x!=B.x) return A.x<B.x;
return A.y<B.y;
} int main(void)
{
int T;
scanf("%d",&T);
Zero.d=Zero.m=Zero.s=;
One.d=One.m=;One.s=;
while(T--)
{
int n,flag=;
scanf("%d",&n);
angle sum=Zero,tot=Zero,delta,q,r;
for(int i=;i<=n;i++)
{
scanf("%d%d%d",&b[i].d,&b[i].m,&b[i].s);
sum=Plus(sum,b[i]);
}
for(int i=;i<=n;i++) scanf("%lf",L+i);
tot.d=(n-)*;
if(Smaller(sum,tot)) {flag=; delta=Minus(tot,sum);}
else delta=Minus(sum,tot);
if(delta.d*+delta.m*+delta.s>*sqrt(n)) {puts("Poor Prince Cao Tan");continue;}
q=Divide(delta,n);
r=Mod(delta,n);
for(int i=;i<=n;i++)
{
double x=L[i],y=L[i-<?n:i-];
if(x>y) swap(x,y);
p[i].id=i;
p[i].x=x;
p[i].y=y;
}
sort(p+,p++n,cmp);
memset(v,,sizeof(v));
for(int i=;i<=n;i++)
{
if(!Smaller(Zero,r)&&!Smaller(r,Zero)) break;
int pos=p[i].id;
v[pos]=Plus(v[pos],One);
r=Minus(r,One);
}
for(int i=;i<=n;i++)
{
if(flag) a[i]=Plus(Plus(b[i],v[i]),q);
else a[i]=Minus(Minus(b[i],v[i]),q);
printf("%d %d %d\n",a[i].d,a[i].m,a[i].s);
}
}
return ;
}
参考代码2
简析:dp[i] 表示花费 i 时间做事情能够得到的最大效率,最后再 O(n) 扫一遍 (t-i) * (dp[i] + 1) 得到最大值
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXT=1e3+;
int dp[MAXT];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,t;
scanf("%d%d",&t,&n);
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++) {
int a,b;
scanf("%d%d",&a,&b);
for(int j=t;j>=a;j--)dp[j]=max(dp[j],dp[j-a]+b);
}
int ans=;
for(int i=;i<t;i++) ans=max(ans,(t-i)*( dp[i]+) );
printf("%d\n",ans);
}
return ;
}
参考代码
简析:用并查集处理每一对能够发生化学反应的药剂,反应次数,
假设一个连通块的大小为 x ,则发生化学反应的次数为 x-1 (x >= 2)将所有的连通块的反应次数加起来即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <bitset>
#include <cmath>
using namespace std; int s[]; int Find(int x)
{
if(s[x] == ) return x;
return s[x] = Find(s[x]);
} void SetUnion(int r1, int r2)
{
s[r2] = r1;
} int main()
{
int t, n, k;
int x, y;
int r1, r2;
int ans;
scanf("%d", &t);
while(t--)
{
ans = ;
memset(s, , sizeof(s));
scanf("%d%d", &n, &k);
for(int i = ; i <= k ; i++)
{
scanf("%d%d", &x, &y);
r1 = Find(x);
r2 = Find(y);
if(r1 != r2)
{
SetUnion(r1, r2);
}
}
for(int i = ; i <= n ; i++)
if(s[i] == ) ans++;
ans = n - ans;
printf("%d\n",ans);
}
return ;
}
参考代码
简析:巴什博奕戳这
#include <cstdio> int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout); int T; scanf("%d", &T);
while(T--) {
int n, m;
scanf("%d%d", &n, &m);
if(n % (m + ) == ) printf("Bob\n");
else printf("Alex\n");
}
return ;
}
参考代码
简析:倒着扫一遍,维护一个最大值max,如果当前的 a[i] > max ,更新 max 的值,
否则将 a[i] 卖掉,得到 max-a[i] 的钱
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const int maxn = 1e6 + ;
LL a[maxn]; int main(void)
{
int T;
scanf("%d",&T);
while(T--)
{
int N;
scanf("%d",&N);
for(int i = ; i <= N; i++) scanf("%I64d",a+i);
LL ans = 0LL, Max = 0LL;
for(int i = N; i >= ; i--)
{
if(a[i] > Max) Max = a[i];
else ans += Max - a[i] ;
}
printf("%I64d\n",ans);
}
return ;
}
参考代码
简析:二分每个人分到的蛋糕大小 x ,每次check 能够分出的块数 tot 是否 >= n
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <ctime>
using namespace std; const int maxn = + ;
const int INF = 0x3f3f3f3f; int n, m;
int a[maxn]; bool check(int x) {
long long tot = ;
for(int i = ; i < m; i++) {
tot += a[i] / x;
}
return tot >= n;
} int main()
{
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout); int T; scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
for(int i = ; i < m; i++) scanf("%d", a + i); if(!check()) {
printf("0\n");
continue;
} int L = , R = INF;
while(L < R) {
int mid = (L + R) / + ;
if(check(mid)) L = mid;
else R = mid - ;
} printf("%d\n", L);
} // printf("Time used = %.3f\n", (double)clock() / CLOCKS_PER_SEC);
return ;
}
参考代码
I.拉面女神的魔盒
简析: 按照题意bfs,状态数不会超过1e6 ,所以可以bfs一遍预处理出所有的答案
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = ;
typedef pair<int, int> pii;
int tmp[], cur[], ans[maxn]; int id(int * a)
{
int ret = a[];
for(int i = ; i <= ; i++)
ret = ret * + a[i];
return ret;
} void change(int no)
{
for(int i = ; i >= ; i--)
cur[i] = no % , no /= ;
return;
} void BFS()
{
queue<pii> q;
q.push(pii(,));
ans[] = ;
while(!q.empty())
{
pii tmp = q.front(); q.pop();
int now = tmp.first, t = tmp.second;
change(now);
int Next, n[], sum = , odd = ;
memcpy(n, cur, sizeof(n));
for(int i = ; i <= ; i++)
{
sum += cur[i];
if(cur[i] % ) odd++;
} n[] = (cur[] + ) % ;
Next = id(n);
if(ans[Next] == -){q.push(pii(Next, t+)); ans[Next] = t + ;} n[] = (cur[] + ) % ;
Next = id(n);
if(ans[Next] == -){q.push(pii(Next, t+)); ans[Next] = t + ;} n[] = cur[]; if(odd == )
{
n[] = (cur[] + ) % ;
Next = id(n);
if(ans[Next] == -){q.push(pii(Next, t+)); ans[Next] = t + ;} n[] = (cur[] + ) % ;
Next = id(n);
if(ans[Next] == -){q.push(pii(Next, t+)); ans[Next] = t + ;} n[] = cur[];
} n[] = (cur[] + ) % ;
Next = id(n);
if(ans[Next] == -){q.push(pii(Next, t+)); ans[Next] = t + ;}
n[] = cur[]; n[] = (cur[] + (sum % + ) ) % ;
Next = id(n);
if(ans[Next] == -){q.push(pii(Next, t+)); ans[Next] = t + ;}
n[] = cur[]; if(cur[] + cur[] + cur[] == )
{
n[] = (cur[] + ) % ;
Next = id(n);
if(ans[Next] == -){q.push(pii(Next, t+)); ans[Next] = t + ;} n[] = (cur[] + ) % ;
Next = id(n);
if(ans[Next] == -){q.push(pii(Next, t+)); ans[Next] = t + ;} n[] = cur[];
} if(cur[] == )
{
n[] = (cur[] + ) % ;
Next = id(n);
if(ans[Next] == -){q.push(pii(Next, t+)); ans[Next] = t + ;}
} }
return;
} int main(void)
{
// freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
memset(ans, -, sizeof(ans));
BFS();
int T;
scanf("%d", &T);
while(T--)
{
for(int i = ; i <= ; i++) scanf("%d", tmp + i);
printf("%d\n", ans[id(tmp)]);
}
return ;
}
参考代码
简析:
~end~
CHD 2015迎新杯题解的更多相关文章
- CHD 2014迎新杯比赛题解
A. 草滩的魔法学校 分析: 高精度乘法 或 JAVA大数类 很明显 10000 的阶乘已经远远超过 64 位数能表示的范围了.所以我们要用一个比较大的数组来存放这个数.那数组要开多少位合适呢?我们不 ...
- chd校内选拔赛题目+题解
题目链接 A. Currency System in Geraldion 有1时,所有大于等于1的数都可由1组成.没有1时,最小不幸的数就是1. #include<iostream> ...
- SCOI 2015 Day2 简要题解
「SCOI2015」小凸玩密室 题意 小凸和小方相约玩密室逃脱,这个密室是一棵有 $ n $ 个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯泡即可逃出密室.每个灯泡有个权值 $ A_i $,每条边 ...
- SCOI 2015 Day1 简要题解
「SCOI2015」小凸玩矩阵 题意 一个 \(N \times M\)( $ N \leq M $ )的矩阵 $ A $,要求小凸从其中选出 $ N $ 个数,其中任意两个数字不能在同一行或同一列, ...
- Boston Key Party 2015 Heath Street 题解(Writeup)
Heath Street是Boston Key Party 2015的一道数字取证题目,我们得到了一个叫做“secretArchive.6303dd5dbddb15ca9c4307d0291f77f4 ...
- 【2015蓝桥杯省赛】C++ B组试题
1.奖券数目 作答:52488,正确 #include <iostream> using namespace std; bool check(int x) { ] = { }; while ...
- BZOJ4104:[Thu Summer Camp 2015]解密运算——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4104 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之 ...
- 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 G - 彩虹岛套娃
题目描述 俄罗斯套娃是俄罗斯特产的木制玩具,一般由多个一样图案的空心木娃娃一个套一个组成,最多可达十多个,通常为圆柱形,底部平坦可以直立.颜色有红色,蓝色,绿色,紫色等.最普通的图案是一个穿着俄罗斯民 ...
- 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 H - 圣诞节糖果
题目描述 圣诞节临近,彩虹岛的黑心商人
随机推荐
- jquery防止事件冒泡和取消默认行为案例
----------------js取消事件冒泡: window.event.cancelBubble=true; --------------jquery事件参数可以防止事件冒泡: $(" ...
- AJAX跨域调用ASP.NET MVC或者WebAPI服务
关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案 作者:陈希章 时间:2014-7-3 问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP. ...
- js urlencode , encodeURIComponent
js 对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent ...
- java UDP网路编程
大家都知道java中的socket网络编程,而其采用的协议分别有tcp和udp协议两种. 通常的理解tcp协议类似于打电话,udp类似于发短信.前者是线程安全的,但是效率比较低.后者则刚好相反. 今天 ...
- printf code
printf背后的故事 2014-01-14 21:54 by Florian, 41 阅读, 0 评论, 收藏, 编辑 printf背后的故事 说起编程语言,C语言大家再熟悉不过.说起最简单的代码, ...
- springMVC3学习(一)--框架搭建
由于项目需要,学习下springMVC,在此简单记录一下. 如有十万个为什么,暂且忽略,待以后研究. 本人是基于3.1.1版本开发,如遇jar包版本冲突等其他问题,概不负责. 下载地址:上传此zip资 ...
- 自动生成Code First代码
自动生成Code First代码 在前面的文章中我们提到Entity Framework的“Code First”模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Fram ...
- ibatis-Spring 整合
这两天一直在研究ibatis与spring的整合 一个小小的demo搞的我头晕目眩的,但程序一旦跑起来了,突然有一种豁然开朗,重见天日,感觉生活很美好的感觉!,也许,这就是那一行行的代码带给我们的不同 ...
- javascript中字符串常用操作整理
javascript中字符串常用操作整理 字符串的操作在js中非常频繁,也非常重要.以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊...今天就对字符串的一些常用 ...
- linux学习心得之目录树开端与/etc(图文)
linux学习心得之目录树开端与/etc(图文) linux中“一切皆文件”,学习linux一年了,在学习过程中对目录树的一点心得,分享给大家,有不对的地方敬请斧正. 不多说了,先上图: 根目录: / ...