ACM题集:https://blog.csdn.net/weixin_39778570/article/details/83187443
题目集合:http://acm.hdu.edu.cn/listproblem.php?vol=11
2081 手机短号
#include<bits/stdc++.h>
#define ll long long
using namespace std;
char a[15];
int t;
int main(){
scanf("%d", &t);
while(t--){
scanf("%s",a);
printf("6%s\n",a+6);
}
return 0;
}
2082 找单词
/*组合问题 母函数模板*/
/*
a保存结果,b中间结果
v权值 n1初始数量 n2终止数量
*/
/*
#include<bits/stdc++.h>
#define ll long long
#define fo(i, j, n) for(int i=j; i<=n; ++i)
using namespace std;
int t,n,k,last,last2;
int a[51],b[51];
int v[26],n2[26]; // 权值,终止数量
int main(){
scanf("%d", &t);
while(t--){
// memset(a,0,sizeof(a));
// memset(b,0,sizeof(b));
// memset(v,0,sizeof(v));
// memset(n2,0,sizeof(n2));
fo(i, 0, 25) {
scanf("%d", &n2[i]);
v[i] = i+1;
}
a[0]=1;
last = 0;
fo(i,0,25){ // 第i个括号
last2 = min(last + n2[i]*v[i],50); // 目前合并能达到最远项
memset(b,0,sizeof(int)*(last2+1));
for(int j=0; j<=n2[i]&&j*v[i]<=last2; j++){ // 遍历第i个括号的每一项
for(int k=0; k<=last&&k+j*v[i]<=last2; k++){ // 遍历a的每一项
b[k+j*v[i]] += a[k];
}
}
memcpy(a,b,sizeof(int)*(last2+1));
last = last2;
}
ll ans = 0;
fo(i,1,50) if(a[i])ans += a[i];
printf("%lld\n", ans);
}
return 0;
}c++
2083 简易版之最短距离
/*排序 然后最短距离所有点到中点的距离和*/
/*
#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
int t,n,a[550];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
fo(i,1,n)scanf("%d",&a[i]);
sort(a+1,a+n+1);// 注意不要漏掉+1
int x = n/2;
int ans = 0;
fo(i,1,x){
ans += a[n+1-i]-a[i];
}
printf("%d\n",ans);
}
return 0;
}
2084 数塔
#include<bits/stdc++.h>
#define ll long long
#define fo(i, j, n) for(int i=j; i<=n; ++i)
using namespace std;
int t,n,a[101][101];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
fo(i,1,n)
fo(j,1,i)
scanf("%d", &a[i][j]);
for(int i=n-1; i>=1; i--)
for(int j=1; j<=i; j++)
a[i][j] += max(a[i+1][j], a[i+1][j+1]);
printf("%d\n",a[1][1]);
}
return 0;
}
2085 核反应堆
#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
int n;
ll sum1,sum2,t1,t2;
int main(){
while(scanf("%d",&n) && n!=-1){
sum1 = 1;
sum2 = 0;
fo(i, 1, n){
t1 = sum1;
t2 = sum2;
sum1 = 3*t1+2*t2;
sum2 = t1+t2;
}
printf("%lld, %lld\n", sum1, sum2);
}
return 0;
}
2086 A1 = ?
/纯公式推导/
/*
2An + 2Cn - An-1 = An+1
2An-1 + 2Cn-1 - An-2 = An
…
2A2 + 2C2 - A1 = A3
2A1 + 2C1 - A0 = A2
上面的式子左右求和,整理得:
A1 = An+1 - An + A0 -2C(1,n) // C(1,n) 指的是c从1累加到n
对An进行同上面步骤求和,整理得:
A1 = An - An-1 + A0 -2C(1,n-1)
…
A2 = A3 - A2 + A0 -2C(1,2)
A1 = A2 - A1 + A0 -2C(1,1)
累加得:
nA1 = An+1 - A1 + nA0 - 2(C(1,1)+C(1,2)+…+C(1,n))
即:
A1 = (An+1 + nA0 + 2*(nC1+(n-1)C2+…+2Cn-1+1Cn)) / n+1
*/
#include<bits/stdc++.h>
#define ll long long
#define fo(i, j, n) for(int i=j; i<=n; ++i)
using namespace std;
int n;
double ans,c_sum,a0,an1,c;
int main(){
while(scanf("%d",&n) != EOF){
scanf("%lf%lf",&a0,&an1);
c_sum = 0;
int nn = n;
fo(i,1,n){
scanf("%lf",&c);
c_sum += c * nn--;
}
ans = (an1+n*a0-2*c_sum) / (n+1);
printf("%.2f\n",ans);
}
return 0;
}
2087 剪花布条
KMP
#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
char s[1005], p[1005];
int n,m,ans,nxt[1005];
int main(){
scanf("%s",s+1);
while(strcmp(s+1,"#")!=0){
scanf("%s", p+1);
n = strlen(s+1);
m = strlen(p+1);
nxt[0] = -1;
int j = -1;
fo(i, 1, m){
while(j>=0 && p[j+1]!=p[i]) j = nxt[j];
nxt[i] = ++j;
}
j = 0;
ans = 0;
fo(i,1,n){
while(j>=0 && p[j+1]!=s[i]) j = nxt[j];
if(++j==m){
ans++;
j=0;
}
}
printf("%d\n",ans);
scanf("%s",s+1);
}
return 0;
}
2088 Box of Bricks
/注意输出格式/
/英文阅读。。。注意模拟/
#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a);
#define pf(a) printf("%lld\n", a);
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
int n,a[55],sum;
ll ans;
int main(){
sf(n);
while(n!=0){
sum = 0;
fo(i,1,n){
sf(a[i]);
sum += a[i];
}
int avg = sum/n;
ans = 0;
fo(i,1,n)
if(a[i]>avg) ans += a[i]-avg;
pf(ans);
sf(n);
if(n)printf("\n");
}
return 0;
}
2089 不要62
/*
sscanf(str,"%d",&a);
sprintf(str,"%.3lf",a);
sprintf(str,"%x",a);//10进制转换成16进制,如果输出大写的字母是sprintf(str,"%X",a)
*/
#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a)
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
char str[1000010];
int a[1000010];
void init(){
fo(i,1,1000000){
// 数字,字符串,进制
sprintf(str,"%d",i);
if(strstr(str, "4")!=NULL) { // 子串判断
a[i] += a[i-1]+1;
}else if(strstr(str, "62")!=NULL) { // 子串判断
a[i] += a[i-1]+1;
}else a[i] = a[i-1];
// pf(a[i]);
}
}
int n,m;
int main(){
init();
while(sf(n)&&sf(m) && (n!=0||m!=0)){
pf((m-n+1)-(a[m]-a[n-1])); // 注意要减去1
}
return 0;
}
2090 算菜价
#include <stdio.h>
char c[1000];
int main()
{
double a,b,sum=0;
while(scanf("%s%lf%lf",c,&a,&b)!=EOF)
{
sum+=a*b;
}
printf("%.1f\n",sum);
return 0;
}
2091 空心三角形
#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a)
#define pf(a) printf("%c", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
char c;
int n;
int main(){
bool flag = 0;
while(scanf("%c",&c) && c!='@' && sf(n)){
getchar(); // 读取末尾换行符号
if(flag)pf('\n');
flag = 1;
int t = n-1;
fo(j,1,t) pf(' ');pf(c);pf('\n');
int zj = 1;
fo(i,2,n-1){
t--;
fo(j,1,t) pf(' ');pf(c);
fo(j,1,zj) pf(' ');pf(c);pf('\n');
zj+=2;
}
if(n>1){fo(i,1,2*n-1)pf(c);pf('\n');} // 没判断n,wa了几次。。。
}
return 0;
}
2092 整数解
/*解一元二次方程*/
#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a)
#define pf(a) printf("%d", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
int n,m;
int main(){
while(sf(n) && sf(m) && (n||m)){
int dt = n*n-4*m;
if(dt<0){
puts("No");continue; // 无解
}
double x1 = (n+sqrt(dt))/2;
double x2 = (n-sqrt(dt))/2;
if((int)x1==x1 && (int)x2==x2)puts("Yes");
else puts("No");
}
return 0;
}
2093 考试排名
#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a)
#define pf(a) printf("%d", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
struct Student{
char name[50];
int sum;
int time;
// 最大堆
bool operator < (const Student &a) const{
if(sum==a.sum)
if(time==a.time)return strcmp(name,a.name)>0;
else return time>a.time;
else return sum < a.sum;
}
};
// 处理一个题的成绩
void calc(char *c, Student &st, int f){
if(c[0]=='0' || c[0]=='-') return;
int res = c[0]-'0';
int len = strlen(c);
int j = len-1;
fo(i,1,len-1){
if(c[i]=='('){
j = i;
break;
}
res *= 10;
res += c[i]-'0';
}
int time =0;
if(j!=len-1){
time = c[j+1]-'0';
fo(i,j+2,len-1){
if(c[i]==')') break;
time *= 10;
time += c[i]-'0';
}
}
st.sum += 1;
st.time += res+time*f;
}
int n, m;
priority_queue<Student> q;
Student stu;
char c[100];
int main(){
cin >> n >> m;
while(cin>>stu.name){
stu.sum=0;
stu.time=0;
fo(i,1,n){
scanf("%s",c);
calc(c,stu,m);
}
q.push(stu);
}
while(!q.empty()){
stu = q.top();
q.pop();
printf("%-10s %2d %4d\n",stu.name,stu.sum,stu.time);
}
return 0;
}
/*8 20
Smith -1 -16 8 0 0 120 39 0
John 116 -2 11 0 0 82 55(1) 0
Josephus 72(3) 126 10 -3 0 47 21(2) -2
Bush 0 -1 -8 0 0 0 0 0
Alice -2 67(2) 13 -1 0 133 79(1) -1
Bob 0 0 57(5) 0 0 168 -7 0*/
2095 find your present (2)
/* 寻找出现奇数次的数,异或运算 */
#include<bits/stdc++.h>
#define ll long long
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
template <class T>
inline bool sf(T &ret){
char c; int sgn;
if(c=getchar(),c==EOF)return 0; // EOF
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn=(c=='-')?-1:1;
ret=(c=='-')?0:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
ret *= sgn;
return 1;
}
int n,ans=0,a;
int main(){
while(sf(n) && n){
ans = 0;
fo(i,1,n){
sf(a);
ans ^= a;
}
pf(ans);
}
return 0;
}
2096 小明A+B
#include<bits/stdc++.h>
#define ll long long
#define pf(a) printf("%d\n",a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
template <class T>
inline bool sf(T &ret){
char c; int sgn;
if(c=getchar(), c==EOF) return 0; // EOF
while(c!='-' && (c<'0'||c>'9')) c=getchar();
sgn = (c=='-')?-1:1;
ret = (c=='-')?0:(c-'0');
while(c=getchar(),c>='0'&&c<='9')ret = ret*10+(c-'0');
ret *= sgn;
return 1;
}
const int mod = 100;
int a,b,ans,n;
int add(int a, int b){
a %= mod;
b %= mod;
return (a+b)%mod;
}
int main(){
sf(n);
while(n--){
sf(a);sf(b);
ans = add(a,b);
pf(ans);
}
return 0;
}
2097 Sky数
#include<bits/stdc++.h>
#define ll long long
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
template <class T>
inline bool sf(T &ret){
char c; int sgn;
if(c=getchar(), c==EOF) return 0; //EOF
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn = (c=='-')?-1:1;
ret = (c=='-')?:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
ret *= sgn;
return 1;
}
int sky(int a, int n){
int res = 0;
while(a){
res += a%n;
a /= n;
}
return res;
}
int n,sk10,sk12,sk16;
int main(){
while(sf(n)&&n){
sk10 = sky(n,10);
sk12 = sky(n,12);
sk16 = sky(n,16);
if(sk10==sk12 && sk10==sk16)
printf("%d is a Sky Number.\n",n);
else printf("%d is not a Sky Number.\n",n);
}
return 0;
}
2098 分拆素数和
#include<bits/stdc++.h>
#define ll long long
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
template <class T>
inline bool sf(T &ret){
char c; int sgn;
if(c=getchar(), c==EOF) return 0; //EOF
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn = (c=='-')?-1:1;
ret = (c=='-')?:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
ret *= sgn;
return 1;
}
const int MAXN=10000;
int prime[MAXN+1];
bool isPrime[MAXN+1];
void getPrime(){
memset(prime,0,sizeof(prime));
for(int i=2;i<=MAXN; i++){
if(!prime[i]) {
prime[++prime[0]]=i;
isPrime[i] = 1;
// cout << prime[0] << " " << i << endl;
}
for(int j=1; j<=prime[0]&&prime[j]<=MAXN/i; j++){
prime[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
}
int n,ans;
int main(){
getPrime();
while(sf(n)&&n){
ans = 0;
fo(i,1,n){
if(prime[i]>=n/2 || prime[i]==1)break;
if(isPrime[n-prime[i]])ans++;
}
pf(ans);
}
return 0;
}
2099 整除的尾数
#include<bits/stdc++.h>
#define ll long long
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
template <class T>
inline bool sf(T &ret){
char c; int sgn;
if(c=getchar(), c==EOF) return 0; //EOF
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn = (c=='-')?-1:1;
ret = (c=='-')?:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
ret *= sgn;
return 1;
}
int a, b;
int main(){
while(sf(a)&&sf(b)&&(a||b)){
a*=100;
bool flat = 0;
fo(i,0,99){
if((a+i)%b==0){
if(flat){
if(i<=9)printf(" %d%d",0,i);
else printf(" %d",i);
}else{
flat = 1;
if(i<=9)printf("%d%d",0,i);
else printf("%d",i);
}
}
}
printf("\n");
}
return 0;
}