2019-2020 ICPC Asia Taipei-Hsinchu Regional Contest

题目列表


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 组队训练

posted @ 2020-09-04 18:24  hachuochuo  阅读(441)  评论(0编辑  收藏  举报