A. Anti-knapsack
输入n,k;求1到n的最多元素子集,该子集任意子集元素和不为k;
没有难度,只要考虑从1到k-1最多可以取多少个即可
{1,k-1},{2,k-2}……抽屉原理
B. Planet Lapituletti
没做出来,贴一个大神的代码学习
#include<iostream>
#include<string>
using namespace std;
int mir[1000];
int tests;
int H,M;
string st;
int cur_h,cur_m;
int get_h(char c1,char c2){
return (c1-48)*10+c2-48;
}
int get_m(char c1,char c2){
return get_h(c1,c2);
}
bool valid_mirror(int h,int m){
if (mir[h/10]==-1||mir[h%10]==-1||mir[m/10]==-1||mir[m%10]==-1)
return false;
int new_h=10*mir[m%10]+mir[m/10];
int new_m=10*mir[h%10]+mir[h/10];
return (new_h<H&&new_m<M);
}
int main() {
//freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
ios_base::sync_with_stdio(0);
//cin.tie(0);
for (int i=0;i<=9;i++){
mir[i]=-1;
}
mir[0]=0;
mir[1]=1;
mir[2]=5;
mir[5]=2;
mir[8]=8;
cin>>tests;
for (;tests;--tests){
cin>>H>>M;
cin>>st;
cur_h=get_h(st[0],st[1]);
cur_m=get_m(st[3],st[4]);
while (true){
if (valid_mirror(cur_h,cur_m))
break;
cur_m++;
if (cur_m==M){
cur_m=0;
cur_h++;
cur_h%=H;
}
}
cout<<cur_h/10<<cur_h%10<<":"<<cur_m/10<<cur_m%10<<endl;
}
//cin.get(); cin.get();
return 0;
}