太菜补题中
题解:
number1:跳台阶
using namespace std;
int main()
{
int n;
cin>>n;
int m;
while(n--){
cin>>m;
int t=1;
for(int i=1;i<m;i++){
t*=2;
}
cout<<t<<endl;
}
return 0;
}
number3:平分游戏
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
int n,k;
ll a[maxn];
ll c[maxn],b[maxn];
bool vis[maxn];
ll solve(int n,int k)
{
ll ret=0;
ll sum=0;
for (int i=0;i<n;i++) sum+=a[i];
if (sum%n!=0) return -1;
ll aver=sum/n;
if (k>=n)
{
for (int i=0;i<n;i++)
if (a[i]!=aver) return -1;
return 0;
}
for (int i=0;i<n;i++)
if (!vis[i])
{
vis[i]=1;
ll tote=a[i];
int m=0; b[m++]=a[i];
int j=(i+k)%n;
while(!vis[j])
{
vis[j]=1;
b[m++]=a[j];
tote+=a[j];
j=(j+k)%n;
}
if (tote%m!=0) return -1;
ll ans=tote/m;
if (ans!=aver) return -1;
c[0]=b[0]-ans;
for (int i=1;i<m;i++)
c[i]=c[i-1]+b[i]-aver;
nth_element(c,c+m/2,c+m);
ll mid=c[m/2];
for (int i=0;i<m;i++)
ret+=abs(c[i]-mid);
}
return ret;
}
int main()
{
scanf("%d%d",&n,&k);
for (int i=0;i<n;i++) scanf("%lld",&a[i]);
ll ans=solve(n,k+1);
/*for(int i=0;i<n;i++){
printf("%d ",b[i]);
}
printf("\n");
for(int i=0;i<n;i++){
printf("%d ",c[i]);
}
printf("\n");*/
if (ans!=-1) printf("%lld\n",ans);
else printf("gg\n");
}
number9:填数字
using namespace std;
int main()
{
cout<<"a"<<"c"<<endl;
return 0;
}
number4:pas面试
using namespace std;
char s[1250];
int dp[1250];
int Max(const int &a,const int &b)
{
return a>b?a:b;
}
int main()
{
while(~scanf("%s",s)){
int len=strlen(s);
int ans=0;
for (int i=0;i<len;++i)
{
dp[i]=1;
if (s[i]>='A'&&s[i]<='Z')
s[i]='a'+s[i]-'A';
}
for (int i=len-1;i>=0;--i)
{
int res=0;
for (int j=i+1;j<len;++j)
{
int tmp=dp[j];
printf("tmp==%d\n",tmp);
if (s[i]==s[j]){
dp[j]=res+2;
printf("j==%d %d\n",j,dp[j]);
}
res=Max(res,tmp);
printf("res==%d\n",res);
}
printf("\n");
}
for(int i=0;i<len;i++){
printf("%d ",dp[i]);
}
printf("\n");
for (int i=0;i<len;++i)
ans=Max(ans,dp[i]);
printf("%d\n",len-ans);
}
return 0;
}
using namespace std;
const int maxn=2000;
int dp[maxn][maxn];
int lps(char*str,int n)
{
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++) dp[i][i]=1;
for(int i=1;i<n;i++){
int tmp=0;
for(int j=0;j+i<n;j++){
if(str[j]==str[j+i])
tmp=dp[j+1][j+i-1]+2;
else
tmp=max(dp[j+1][j+i],dp[j][j+i-1]);
dp[j][j+i]=tmp;
}
}
return dp[0][n-1];
}
int main()
{
char str[maxn];
while(scanf("%s",str)!=EOF)
{
int len=strlen(str);
for (int i=0;i<len;++i){
if (str[i]>='A'&&str[i]<='Z')
str[i]='a'+str[i]-'A';
}
int res=lps(str,len);
printf("%d\n",len-res);
}
return 0;
}
number F
思路:
1/x+1/y=1/n,设x=n+a,y=n+b,化简可得n^2=a*b,
找出n^2的所有因子,根据数论中的唯一分解定理可得
任何整数n都可以表示为 n = p1^e1*p2^e2*..pn^en,
其中p1,p2…,pn都为素数,并且n的约数个数为(1+e1)*(1+e2)*…(1+en),
所以n^2 = (p1^e1*p2^e2…pn^en)^2 = (p1^2e1)*(p2^2e2)…*(pn^2en),所以因子个数为(1+2e1)*(1+2e2)*…(1+2en),所以可以利用唯一分解定理求出e1 e2…en,由于要满足x <= y所以只需找出a <= b的解的个数即可,设因子乘积为res,x<=y,所以res/2+1。
using namespace std;
const int N = 1005;
typedef long long ll;
int num[N];
int main()
{
int t;
cin>>t;
while(t--){
int n,cnt=0;
memset(num,0,sizeof(num));
cin>>n;
for(int i=2;i*i<=n;++i){
if(n%i==0){
while(n%i==0){
num[cnt]++;
n/=i;
}
cnt++;
}
}
if(n!=1){
num[cnt]++;
cnt++;
}
int res=1;
for(int i=0;i<cnt;++i)
res=res*(num[i]*2+1);
printf("%d\n",res/2+1);
}
}
number回旋星空:求等腰三角形的个数:使用去重函数unique(),
注意:使用unique函数去前先排序
using namespace std;
const int maxn=1000+10;
int t,n;
int a[maxn],b[maxn];
int c[maxn*maxn];
int main()
{
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i]>>b[i];
}
int res=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
c[j]=(a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]);
}
sort(c,c+n);
int ans=unique(c,c+n)-c;
res+=n-ans;
}
if(res==0){
cout<<"WA"<<endl;
}else{
cout<<res*2<<endl;
}
}
return 0;
}
number回旋矩阵
using namespace std;
int t;
int n,m;
char a[30][30];
char b[30][30];
char c[30][30];
char d[30][30];
string s;
void zhuan90()
{
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
b[m-j-1][i]=a[i][j];
}
}
}
void zhuan180()
{
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
c[n-i-1][m-j-1]=a[i][j];
}
}
}
void zhuan270()
{
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
d[m-j-1][i]=c[i][j];
}
}
}
int main()
{
cin>>t;
while(t--){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
zhuan90();
zhuan180();
zhuan270();
cin>>s;
int len=s.length();
int ls=0;
for(int i=0;i<len;i++){
if(s[i]=='L')ls=(ls+1)%4;
else ls=(ls+3)%4;
}
if(ls==0){
cout<<n<<" "<<m<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<a[i][j];
}
cout<<endl;
}
}else if(ls==1){
cout<<m<<" "<<n<<endl;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(b[i][j]=='|'){
cout<<"-";
}else if(b[i][j]=='-'){
cout<<"|";
}else cout<<b[i][j];
}
cout<<endl;
}
}else if(ls==2){
cout<<n<<" "<<m<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<c[i][j];
}
cout<<endl;
}
}else if(ls==3){
cout<<m<<" "<<n<<endl;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(d[i][j]=='|'){
cout<<"-";
}else if(d[i][j]=='-'){
cout<<"|";
}else cout<<d[i][j];
}
cout<<endl;
}
}
cout<<endl;
}
return 0;
}
ac2
using namespace std;
typedef unsigned long long ull;
typedef long long LL;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;
int n, m;
char s[35][35], op[1005];
int main() {
int T; scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%s", s[i] + 1);
scanf("%s", op);
int cur = 0;
for (int i = 0; op[i]; ++i) {
if (op[i] == 'L') {
cur = (cur + 1) % 4;
} else {
cur = (cur + 3) % 4;
}
}
if (cur == 0) {
printf("%d %d\n", n, m);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) printf("%c", s[i][j]);
puts("");
}
} else if (cur == 1) {
printf("%d %d\n", m, n);
for (int j = m; j >= 1; --j) {
for (int i = 1; i <= n; ++i) {
if (s[i][j] == '|') s[i][j] = '-';
else if (s[i][j] == '-') s[i][j] = '|';
printf("%c", s[i][j]);
}
puts("");
}
} else if (cur == 2) {
printf("%d %d\n", n, m);
for (int i = n; i >= 1; --i) {
for (int j = m; j >= 1; --j) printf("%c", s[i][j]);
puts("");
}
} else {
printf("%d %d\n", m, n);
for (int j = 1; j <= m; ++j) {
for (int i = n; i >= 1; --i) {
if (s[i][j] == '|') s[i][j] = '-';
else if (s[i][j] == '-') s[i][j] = '|';
printf("%c", s[i][j]);
}
puts("");
}
}
puts("");
}
return 0;
}
number 强迫症序列
:暴力超时
;
using namespace std;
const int maxn=1e6+10;
int t;
int n;
int a[maxn];
int main()
{
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int ans;
sort(a,a+n);
ans=unique(a,a+n)-a;
int k=0;
if(ans==1)cout<<k<<" "<<a[0]<<endl;
else{
int flag;
while(1){
flag=0;
sort(a,a+n);
for(int i=0;i<n-1;i++){
a[i]+=1;
}
/*for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;*/
for(int i=0;i<n-1;i++){
if(a[i]==a[i+1]){
flag++;
}
}
//cout<<"flag=="<<flag<<endl;
k++;
if(flag==n-1){
break;
}
}
if(flag==n-1)
cout<<k<<" "<<a[0]<<endl;
}
}
return 0;
}
ac代码:
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
int t;
int n;
ll a[maxn];
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--){
cin>>n;
ll sum=0;
ll minn=1e9;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
minn=min(minn,a[i]);
}
ll num=sum-n*minn;
cout<<num<<" "<<(sum+num*(n-1))/n<<endl;
}
}
ac使用dp
using namespace std;
const int maxn=1e6+100;
typedef long long ll;
int t;
int n;
ll a[maxn];
ll d;
ll ans;
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
d=0;
ans=a[0];
ll tmp;
for(int i=1;i<n;i++){
tmp=d;
// cout<<"tmp=="<<tmp<<endl;
d=d*2+a[i]-ans;
// cout<<"d=="<<d<<endl;
ans=tmp+a[i];
// cout<<"ans=="<<ans<<endl;
}
cout<<d<<" "<<ans<<endl;
}
return 0;
}