ACM--South Pacific 2012
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=584
A:UVAlive 6161 Decision Making
题意:给出01字符串,判断中间两位是否相同,相同就输出Do-it,否者输出Do-it-Not。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define inf 0x7fffffff
using namespace std;
const int maxn=+;
char str[maxn];
int main()
{
int t;
cin>>t;
while (t--)
{
memset(str,,sizeof(str));
scanf("%s",str+);
int len=strlen(str+);
if (str[len/]==str[len/+]) cout<<"Do-it"<<endl;
else cout<<"Do-it-Not"<<endl;
}
return ;
}
题意:一个人学习练车,如果练车时间累加达到50个小时(包括夜晚练车时间10个小时)的话,就通过考核。在每天的练车时间中,不能超过2小时,题目输入中每行给出4个时刻,分别是日升、日落、练车开始时刻、练车结束时刻。如果在日落后或者在日升前练车的话,这段时间就算作夜晚的练车时间。如果整个练车时间里有超过一半的时间在夜晚练车时间,那么整个时间都算作夜晚练车时间。
解法:水题一类,按照题意模拟,注意细节处理就可以了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define inf 0x7fffffff
using namespace std;
int n;
int main()
{
int n;
int a,b,c,d,e,f,g,h;
int total=,night=;
while (cin>>n,n)
{
total=night=;
int ok=;
for (int i= ;i<=n ;i++)
{
scanf("%d:%d %d:%d %d:%d %d:%d",&a,&b,&c,&d,&e,&f,&g,&h);
int num1=a*+b;
int num2=c*+d;
int num3=e*+f;
int num4=g*+h;
if (num4-num3>) ok=;
total += num4-num3;
if (num3<num4 && num4<=num1) night += num4-num3;
else if (num3<=num1&&num4<=num2) night += num1-num3;
else if (num3<=num1&&num2<=num4) night += num1-num3+num4-num2;
else if (num1<num3&&num3<=num2&&num2<num4) night += num4-num2;
else if (num2<=num3) night += num4-num3;
}
if (ok) cout<<"NON"<<endl;
else if (total>=* && night>=*) cout<<"PASS"<<endl;
else cout<<"NON"<<endl;
}
return ;
}
题意:给出很多组的数字串,每组数字串由4个数字组成。对于每组数字串来说,你可以在每个数字前面加上+,-,*,/,(,),使其每组数字串之和为10,就让我们每组数字串的和是否都有可能为10。
解法:由于只有4个数字,我们可以先把其中两个数字合并在一起,就只有3个数字了,接下来又在3个数字中选择其中2个合并起来,这样就成了2个数字的运算了。
通过枚举运算符号和括号、next_permutation函数就可以实现上面说的方法了。
注意一点:这道题里面如果把减号放在一个数前面,不能把它整体看成负数来处理。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define inf 0x7fffffff
using namespace std;
int n;
int cmp(int i,int j) {return i<j; }
int main()
{
int an[];
char str[];
while (cin>>n,n)
{
int count=;
int bn[],cn[];
for (int k= ;k<=n ;k++)
{
for (int j= ;j<= ;j++) {cin>>str[j];an[j]=str[j]-'';}
sort(an+,an++,cmp);
int cnt=;
int flag=;
do {
for (int i= ;i<= ;i++) {
if (i==) bn[]=an[]+an[];
else if (i==) bn[]=an[]-an[];
else if (i==) bn[]=an[]*an[];
else if (i== && an[]) bn[]=an[]/an[];
//else if (i==5) bn[1]=-an[1]+an[2];
//else if (i==6) bn[1]=-an[1]-an[2];
//else if (i==7) bn[1]=(-an[1])*an[2];
//else if (i==8 && an[2]) bn[1]=(-an[1])/an[2];
bn[]=an[];
bn[]=an[];
sort(bn+,bn+,cmp);
do
{
for (int j= ;j<= ;j++) {
if (j==) cn[]=bn[]+bn[];
else if (j==) cn[]=bn[]-bn[];
else if (j==) cn[]=bn[]*bn[];
else if (j== && bn[]) cn[]=bn[]/bn[];
//else if (j==5) cn[1]=-bn[1]+bn[2];
//else if (j==6) cn[1]=-bn[1]-bn[2];
//else if (j==7) cn[1]=(-bn[1])*bn[2];
//else if (j==8 && bn[2]) cn[1]=(-bn[1])/bn[2];
cn[]=bn[];
sort(cn+,cn+,cmp);
do
{
int sum=cn[]+cn[];if (sum==) {flag=;break; }
sum=cn[]-cn[];if (sum==) {flag=;break; }
sum=cn[]*cn[];if (sum==) {flag=;break; }if (cn[])
sum=cn[]/cn[];if (sum==) {flag=;break; }
//sum=(-cn[1])+cn[2];if (sum==10) {flag=0;break; }
//sum=(-cn[1])-cn[2];if (sum==10) {flag=0;break; }
//sum=(-cn[1])*cn[2];if (sum==10) {flag=0;break; }if (cn[2])
//sum=(-cn[1])/cn[2];if (sum==10) {flag=0;break; } }while(next_permutation(cn+,cn+) && flag);
} }while (next_permutation(bn+,bn+) && flag);
sort(bn+,bn+,cmp);
do
{
for (int j= ;j<= ;j++) {
if (j==) cn[]=bn[]+bn[];
else if (j==) cn[]=bn[]-bn[];
else if (j==) cn[]=bn[]*bn[];
else if (j== && bn[]) cn[]=bn[]/bn[];
//else if (j==5) cn[1]=-bn[2]+bn[3];
//else if (j==6) cn[1]=-bn[2]-bn[3];
//else if (j==7) cn[1]=(-bn[2])*bn[3];
//else if (j==8 && bn[3]) cn[1]=(-bn[2])/bn[3];
cn[]=bn[];
sort(cn+,cn+,cmp);
do
{
int sum=cn[]+cn[];if (sum==) {flag=;break; }
sum=cn[]-cn[];if (sum==) {flag=;break; }
sum=cn[]*cn[];if (sum==) {flag=;break; }if (cn[])
sum=cn[]/cn[];if (sum==) {flag=;break; }
//s/um=(-cn[1])+cn[2];if (sum==10) {flag=0;break; }
//sum=(-cn[1])-cn[2];if (sum==10) {flag=0;break; }
//sum=(-cn[1])*cn[2];if (sum==10) {flag=0;break; }if (cn[2])
//sum=(-cn[1])/cn[2];if (sum==10) {flag=0;break; } }while(next_permutation(cn+,cn+) && flag);
} }while (next_permutation(bn+,bn+) && flag); }
}while (next_permutation(an+,an+) && flag);
if (flag==) {count++; }
}
if (count==n) cout<<"TRUE"<<endl;
else cout<<"BUSTED"<<endl;
}
return ;
}
题意:有一个密码锁,有k层密码组成,每一层有一些数字,然后从k层中每层选出一个数来构成一个方程组,题目给出这样的k组方程式的系数和运算结果,要你在k层中找到这样的解满足这k组方程。
解法:高斯消元解方程组。然后判断解出的解x1,x2,x3....xk是否在k层密码数字中(x1是否在k1这一层数字中,x2是否在k2这一层中...)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define inf 0x7fffffff
#define eps 1e-10
using namespace std;
typedef long long LL;
int n;
int an[][];
bool free_x[]; ///判断是否是不确定的变元
double x[]; ///解集
int sign(double x){ return (x>eps) - (x<-eps);}
int Gauss(double A[][])
{
int i,j;
int row,col,max_r;
for(row=,col=; row<n&&col<n; row++,col++)
{
max_r = row;
for(i = row+; i < n; i++) ///找到当前列所有行中的最大值(做除法时减小误差)
{
if(sign(fabs(A[i][col])-fabs(A[max_r][col]))>)
max_r = i;
}
if(max_r != row) ///将该行与当前行交换
{
for(j = row; j < n+; j++)
swap(A[max_r][j],A[row][j]);
}
if(sign(A[row][col])==) ///当前列row行以下全为0(包括row行)
{
row--;
continue;
}
for(i = row+; i < n; i++)
{
if(sign(A[i][col])==)
continue;
double ta = A[i][col]/A[row][col];
for(j = col; j < n+; j++)
A[i][j] -= A[row][j]*ta;
}
}
for(i = row; i < n; i++) ///col=n存在0...0,a的情况,无解
{
if(sign(A[i][col]))
return -;
}
if(row < n) ///存在0...0,0的情况,有多个解,自由变元个数为n-row个
{
memset(free_x,true,sizeof(free_x));
for(i = row-; i >=; i--)
{
int free_num = ; ///自由变元的个数
int free_index; ///自由变元的序号
for(j = ; j < n; j++)
{
if(sign(A[i][j])!= && free_x[j])
free_num++,free_index=j;
}
if(free_num > ) continue; ///该行中的不确定的变元的个数超过1个,无法求解,它们仍然为不确定的变元
///只有一个不确定的变元free_index,可以求解出该变元,且该变元是确定的
double tmp = A[i][n];
for(j = ; j < n; j++)
{
if(sign(A[i][j])!= && j!=free_index)
tmp -= A[i][j]*x[j];
}
x[free_index] = tmp/A[i][free_index];
free_x[free_index] = false;
}
return n-row;
}
///有且仅有一个解,严格的上三角矩阵(n==m)
for(i = n-; i >= ; i--)
{
double tmp = A[i][n];
for(j = i+; j < n; j++)
if(sign(A[i][j])!=)
tmp -= A[i][j]*x[j];
x[i] = tmp/A[i][i];
}
return ;
}
//void gauss_elimination(double A[][60],int n)
//{
// int i,j,k,r;
// for (i=0 ;i<n ;i++)
// {
// r=i;
// for (j=i+1 ;j<n ;j++)
// if (fabs(A[j][i])>fabs(A[r][i])) r=j;
// if (r!=i) for (j=0 ;j<=n ;j++) swap(A[r][j],A[i][j]);
// for (k=i+1 ;k<n ;k++)
// {
// double f=A[k][i]/A[i][i];
// for (j=i ;j<=n ;j++) A[k][j] -= f*A[i][j];
// }
// }
// for (i=n-1 ;i>=0 ;i--)
// {
// for (j=i+1 ;j<n ;j++)
// A[i][n] -= A[j][n]*A[i][j];
// A[i][n] /= A[i][i];
// }
//}
int main()
{
while (cin>>n,n)
{
int a;
char c;
getchar();
char str[];
for (int i= ;i<n ;i++)
{
int sum=;
int cnt=;
memset(str,,sizeof(str));
gets(str);
int len=strlen(str);
for (int j= ;j<len ;j++)
{
if (str[j]==' ')
{
an[i][cnt++]=sum;
sum=;
}
else sum=sum*+str[j]-'';
if (j==len-) an[i][cnt++]=sum;
}
an[i][cnt]=-;
}
double bn[][];
for (int i= ;i<n ;i++)
{
for (int j= ;j<n ;j++) cin>>bn[i][j];
scanf(" = %lf",&bn[i][n]);
}
// for (int i=0 ;i<n ;i++)
// {
// for (int j=0 ;j<=n ;j++) cout<<bn[i][j]<<" ";
// cout<<endl;
// }
int h=Gauss(bn);
//gauss_elimination(bn,n);
// for (int i=0 ;i<n ;i++)
// {
// for (int j=0 ;j<=n ;j++) cout<<bn[i][j]<<" ";
// cout<<endl;
// }
if (h)
{
for (int i= ;i<h ;i++) cout<<x[i]<<" ";
for (int i=h ;i<n ;i++) cout<<an[i][]<<" ";
cout<<endl;
}
else
{
for (int i= ;i<n ;i++) cout<<x[i]<<" ";
cout<<endl;
}
}
return ;
}
题意:学校有幼儿园和小学一到六个年级,一个班对应一个老师,现在每个年级有一批学生,幼儿园到二年级每个班最多容纳20个人,三到四年级每个班最多容纳25个人,五到六年级一个班最多30人,每个年级的同学如果人数没有达到上限,可以从相邻的年级凑人数,比如三年级的人数不够的话,只能从二年级和四年级中找同学来凑。现在问最少需要多少个老师。
解法:贪心。我们先从幼儿园开始,幼儿园组成几个班后,如果人数不够的话,就从一年级学生中找来;接着处理一年级的人数,如果有空缺,就从三年级中找同学来;按此方法接着四年级、五年级。最后处理六年级,如果六年级人数不够的话,就不用填补了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define inf 0x7fffffff
using namespace std;
//20 20 20 25 25 30 30
int main()
{
int an[];
while (cin>>an[]>>an[]>>an[]>>an[]>>an[]>>an[]>>an[])
{
if (!an[] && !an[] && !an[] && !an[] && !an[] && !an[] && !an[]) break;
int count=;
if (an[]%)
{
count += an[]/+;
an[] -= (-(an[]%));
}
else count += an[]/;
if (an[]<=) {}
else if (an[]%)
{
count += an[]/+;
an[] -= (-(an[]%));
}
else count += an[]/;
if (an[]<=) {}
else if (an[]%)
{
count += an[]/+;
an[] -= (-(an[]%));
}
else count += an[]/;
if (an[]<=) {}
else if (an[]%)
{
count += an[]/+;
an[] -= (-(an[]%));
}
else count += an[]/;
if (an[]<=) {}
else if (an[]%)
{
count += an[]/+;
an[] -= (-(an[]%));
}
else count += an[]/;
if (an[]<=) {}
else if (an[]%)
{
count += an[]/+;
an[] -= (-(an[]%));
}
else count += an[]/;
if (an[]<=) {}
else if (an[]%) count += an[]/+;
else count += an[]/;
cout<<count<<endl;
}
return ;
}
题意:给出一个foom、food和twob的值,要求是否有这样一组解,满足x个foom 和 y个food 等于1个twob的值,如果有满足,输出x+y最小的一组。
解法:扩展欧几里德算法。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define inf 0x7fffffff
using namespace std;
typedef long long LL;
LL x,y,z;
LL q;
LL u,v,w;
LL gcd(LL a,LL b)
{
if (!b) return a;
return gcd(b,a%b);
}
void exgcd(LL a,LL b)
{
if (!b) {x= ;y= ;q=a; }
else
{
exgcd(b,a%b);
LL temp=x ;x=y ;y=temp-a/b*y;
}
}
int main()
{
while (cin>>u>>v>>w)
{
if (!u && !v && !w) break;
LL d=gcd(u,v);
if (w%d)
{
cout<<"Unquibable!"<<endl;
continue;
}
LL c=w/d;
//u /= d ;v /= d;
exgcd(u,v);
x=((((x%(v/d)+(v/d))%(v/d))*(c%(v/d))+(v/d))%(v/d));
y=(w-u*x)/v;
if (y<)
{
cout<<"Unquibable!"<<endl;
continue;
}
// x *= c ;y *= c;
// x=(x%v+v)%v;
// y=(y%u+u)%u;
// int flag=0;
// for (LL k=-100 ;k<100 ;k++)
// {
// LL x1=x+k*(v/d);
// LL y1=y-k*(u/d);
// if (x1>=0 && y1>=0 && x1*u<y1*v)
// {
//
// if (x1+y1<x+y)
// {
// flag=1;
// x=x1 ;y=y1 ;
// }
// }
// }
// if (!flag) {cout<<"Unquibable!"<<endl;continue;}
cout<<x<<" foom";
if (x!=) cout<<"s";
cout<<" and "<<y<<" foob";
if (y!=) cout<<"s";
cout<<" for a twob!"<<endl; }
return ;
}
ACM--South Pacific 2012的更多相关文章
- 2016-2017 ACM-ICPC, South Pacific Regional Contest (SPPC 16)
题目链接 Codeforces_Gym_101177 Problem A Anticlockwise Motion 直接模拟即可 #include<iostream> #include ...
- [水题日常]UVA1639 糖果(Candy,ACM/ICPC Chengdu 2012)
今天来尝试了几道数学期望相关的题,这是我认为比较有趣的一道题 这次不废话啦直接开始~ 一句话题意:两个分别装有n个糖果的盒子,每次随机选一个盒子然后拿走一颗糖(选的概率分别是\(p\)和\((1-p) ...
- USACO 6.1 Postal Vans(一道神奇的dp)
Postal Vans ACM South Pacific Region -- 2003 Tiring of their idyllic fields, the cows have moved to ...
- 微软亚洲研究院研究员获选IEEE Fellow 和ACM Distinguished Member
年末将至,微软亚洲研究院喜讯连连.近日,IEEE(国际电气电子工程师学会)和ACM(美国计算机协会)先后公布了2017年度的院士名单(IEEE Fellow)和2016年度杰出会员名单(ACM D ...
- 中国计算机学会CCF推荐国际学术会议
中国计算机学会推荐国际学术会议 (计算机系统与高性能计算) 一.A类 序号 会议简称 会议全称 出版社 网址 1 ASPLOS Architectural Support for Programmin ...
- CCF推荐国际学术会议
类别如下计算机系统与高性能计算,计算机网络,网络与信息安全,软件工程,系统软件与程序设计语言,数据库.数据挖掘与内容检索,计算机科学理论,计算机图形学与多媒体,人工智能与模式识别,人机交互与普适计算, ...
- 中国计算机学会CCF推荐国际学术期刊会议(最新版)
中国计算机学会推荐国际学术期刊会议 2014年12月,中国计算机学会(CCF)启动新一轮<)计算机体系结构/高性能计算/存储系统: )计算机网络:)网络与信息安全:)软件工程/系统软件/程序设计 ...
- SCI&EI 英文PAPER投稿经验【转】
英文投稿的一点经验[转载] From: http://chl033.woku.com/article/2893317.html 1. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时 ...
- myhuiban会议,期刊,科研人员,计算机类会议大全
http://www.myhuiban.com/ List of computer science conferences From Wikipedia, the free encyclopedia ...
随机推荐
- Ueditor图片缩放的设置
最近在用Ueditor,功能绝逼强大,不过也有遗憾的地方,上传图片的时候自动缩放的小了,想要图片按宽度整体等比缩放,找了好久,研究了下,终于找到解决方法了. 先改前台的的dialogs/image/i ...
- mysql 根据生日计算年龄,并查询在18-25之间的语句
select id, DATE_FORMAT(birthday,"%Y-%m-%d") birthday, CURDATE() , (year(now())-year(birthd ...
- js 将json字符串转换为json兑现
在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键.例如:JSON字符串:var str1 = '{ &quo ...
- keytool 获取证书信息
keytool -list -v -keystore E:\androidkestore 红色部分为证书地址 输入密码后得到md5及sha1 google地图和百度地图申请key可能用到
- delphi xe6 打开andoridGPS设置
Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Location, ...
- Delphi初学者应小心的六大陷阱
Delphi初学者应小心的六大陷阱 作者:子夜编译 初学DelphiI的人,由于各种原因,对DelphiI中的许多概念不能很好的理解,并由此带来了许多的问题,或者是开发出的程序稳性不好 ...
- virtualenv python虚拟环境搭建
python virtualenv.py flask
- C 实现一个简易的Http服务器
引言 做一个老实人挺好的,至少还觉得自己挺老实的. 再分享一首 自己喜欢的诗人的一首 情景诗. 每个人总会有问题,至少喜欢就好, 本文 参照 http 协议 http://www.cnblogs. ...
- 菜鸟学习Spring——第一个例子
一.概述 原来我们利用工厂来实现灵活的配置.现在利用Spring以后把这个交给了IoC容器管理.我们只要在XML文件上配上就可以了这样的话就节省了很多开发时间我们不需要知道后面的有多少只要动态的配上类 ...
- jdk 1.6 & 1.7新特性
jdk1.6新特性 1.Desktop类和SystemTray类 2.使用JAXB2来实现对象与XML之间的映射 3.StAX 4.使用Compiler API 5.轻量级Http Server AP ...