2019-2020 ICPC Asia Taipei-Hsinchu Regional Contest
题目列表
- C - Are They All Integers?
- D - Tapioka
- E - The League of Sequence Designers
- H - Mining a
- J - Automatic Control Machine
- K - Length of Bundle Rope
practice link:https://vjudge.net/contest/392746#overview
C - Are They All Integers?
思路:直接按题意模拟暴力即可。
代码:
‘’‘’‘’
int a[55];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int kk=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
if(i!=j&&i!=k&&j!=k){
if((a[i]-a[j])%a[k]!=0){
kk=0;
printf("no\n");
return 0;
}
}
}
}
}
printf("yes");
return 0;
}
D - Tapioka
签到题。
代码:
‘’‘’‘’
int main()
{
char s[33];
bool flag = 0;
while(~scanf("%s",s))
{
if(strcmp(s,"bubble")!=0&&strcmp(s,"tapioka")!=0)
{
printf("%s ",s);
flag = 1;
}
}
if(!flag) printf("nothing\n");
}
E - The League of Sequence Designers
题意:构造题。求
其中,n<2000 ,题目中给你一个伪代码,但其中有错误。给你 k 和 L ,让你构造出一组数据,其中长度n>=L , 且伪代码的答案与正确答案相差k。
思路:首先n>=L ,所以当L>1999时,答案为 -1 。观察伪代码,可以看到当a[i]是负数是,该代码就会不计这一位,因此我们可以让 a[1]=-1,然后我们构造一个长度为1999的数组,见图:
代码:
‘’‘’‘’
int main()
{
int T,k,l;
cin>>T;
while(T--){
scanf("%d %d",&k,&l);
if(l>1999){
printf("-1");
}else{
printf("1999\n");
printf("-1");
int cnt=(k+1999)%1998;
int num=(k+1999)/1998;
for(int i=2;i<1999;i++){
printf(" %d",num);
}
printf(" %d\n",num+cnt);
}
}
return 0;
}
H - Mining a
思路1:队友的暴力枚举
代码1:
‘’‘’‘’
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ll n;
scanf("%lld",&n);
ll maxn = 0;
for(ll i=2*n-1;i>n;i--)
{
if((n*i)%(i-n)==0)
{
maxn = max(maxn,i^(n*i/(i-n)));
}
}
printf("%lld\n",maxn);
}
}
思路2:猜结论:\(_𝑎_=_𝑛_(_𝑛_+1)⊕(_𝑛_+1)\)
代码:
‘’‘’‘’
int main() {
int t;
cin >> t;
while (t--) {
ll n; cin >> n;
ll ans = (n * (n + 1ll) ^ (n + 1ll));
cout << ans << '\n';
}
}
J - Automatic Control Machine
思路:利用二进制枚举,枚举每个可能的状态,用bitset维护每次处理,因为行数很少,就可以直接在二进制枚举内枚举每行是否存在制定位置,然后求最小值即可。
代码:
‘’‘’‘’
int a[20][505];
bitset<510>mp[20],pp;
int main()
{
int T,n,m;
cin>>T;
while(T--){
scanf("%d %d",&m,&n);
getchar();
for(int i=1;i<=n;i++){
mp[i].reset();
for(int j=1;j<=m;j++){
scanf("%c",&a[i][j]);
mp[i][j-1]=(a[i][j]=='1');
}
getchar();
}
int ans=INF,num=0;
for(int i=0;i<(1<<n);i++){
pp.reset();
num=0;
for(int j=1;j<=n;j++){
if((1<<(j-1))&i){//判断第j位是否存在
num++;
pp|=mp[j];
}
}
if(pp.count()==m){
ans=min(ans,num);
}
}
if(ans==INF)cout<<"-1"<<endl;
else cout<<ans<<endl;
}
return 0;
}
K - Length of Bundle Rope
思路:用优先队列维护前两个最小的,然后不断加上前两个数的和即可。
代码:
‘’‘’‘’
priority_queue<int,vector<int>, greater<int> > q;
int main()
{
int T,n;
cin>>T;
while(T--){
while(!q.empty()){
q.pop();
}
scanf("%d",&n);
for(int i=1;i<=n;i++){
int num;
scanf("%d",&num);
q.push(num);
}
ll sum=0;
while(!q.empty()){
int p1,p2;
p1=q.top();
q.pop();
if(!q.empty()){
p2=q.top();
q.pop();
}else{
p2=0;
}
if(!q.empty()){
q.push(p1+p2);
}
sum=sum+p1+p2;
}
printf("%lld\n",sum);
}
return 0;
}
记 9.4 组队训练
越自律,越自由