先存个样~~之后补全
具体移至博客这个文章<<<---点击查看后应该对你有帮助
这是我的写法,有什么建议或者更好的方法,或者错了可以告诉我。。
A:美丽的 2
思路:直接1-2020枚举判断
int main(){
int tot=0;
for(int i=1;i<=2020;i++){
int k=i;
while(k){
int g=k%10;
k/=10;
if(g==2){tot++;break;}
}
}
cout<<tot<<endl;
return 0;
}
答案:563
B:扩散
思路:bfs跑,,然后时间在2020内都记录,边记录边累计个数,每个加个2100,从0开始,一分钟向上扩散1,最多不超过2100
struct node{
int x;
int y;
int t;
};
int da[4][2]={1,0,-1,0,0,-1,0,1};
int n=2100;
int ma[10000][10000],vis[10000][10000];
queue<node> q;
void bfs(){
mem(ma,0);
mem(vis,0);
node s,p;
p.t=0,p.x=n,p.y=n;q.push(p);
p.t=0,p.x=n+2000,p.y=n+2000;q.push(p);
p.t=0,p.x=n+2020,p.y=n+11;q.push(p);
p.t=0,p.x=n+11,p.y=n+14;q.push(p);
vis[n][n]=vis[n+2000][n+2000]=vis[n+2020][n+11]=vis[n+11][n+14]=1;
ll ans=4;
while(!q.empty()){
p=q.front();
q.pop();
for(int i=0;i<4;i++){
s.x=p.x+da[i][0];
s.y=p.y+da[i][1];
s.t=p.t+1;
if(vis[s.x][s.y]==0&&s.t<=2020){
vis[s.x][s.y]=1;
ans++;
q.push(s);
}
}
}
cout<<ans<<endl;
}
int main(){
bfs();
return 0;
}
答案:20312088
C阶层约数
答案:39001250856960000
D:本质上升序列
思路:计算每个子序列,我先转化成数字了
代码:
ull ma[250],dp[250];
int main(){
mem(dp,0);
for(int i=0;i<250;i++)dp[i]=1;
string ch;
cin>>ch;
cout<<ch.length()<<endl;
for(int i=0;i<ch.length();i++){
ma[i]=ch[i]-'a';
}
for(int i=0;i<ch.length();i++){
for(int j=0;j<i;j++){
if(ma[i]>ma[j])dp[i]+=dp[j];
}
}
ull ans=0;
for(int i=0;i<ch.length();i++){
ans+=dp[i];
}
cout<<ans<<endl;
return 0;
}
答案:2472673705(怎么感觉错了,好多人是:3616159)
题 E: 玩具蛇
思路:dfs各个找一遍,实话说,这题好像比前面简单。。
ll tot=0,n=4;
int ma[5][5];
int da[4][2]={-1,0,1,0,0,-1,0,1};
void dfs(int i,int j,int k){
if(!ma[i][j]&&k==n*n){
tot++;
return ;
}
ma[i][j]=k;
for(int e=0;e<4;e++){
int dx=i+da[e][0];
int dy=j+da[e][1];
if(dx>=1&&dy>=1&&dy<=n&&dx<=n&&!ma[dx][dy]){
dfs(dx,dy,k+1);
}
}
ma[i][j]=0;
}
int main(){
mem(ma,0);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
dfs(i,j,1);
cout<<tot<<endl;
}
cout<<tot<<endl;
return 0;
}
答案:552
F: 皮亚诺曲线距离
代码:没写出来。。
G: 游园安排
思路:排个顺序,比较字母个数,小字母多的放前面,一样多的,小字母靠前放前面
(不敢保证完全对)代码:
string x[1000001];
bool cmp(const string a,const string b){
int visa[30],visb[30];
mem(visa,0);
mem(visb,0);
visa[a[0]-'A']++;
visb[b[0]-'A']++;
for(int i=1;i<a.length();i++)
visa[a[i]-'a']++;
for(int i=1;i<b.length();i++)
visb[b[i]-'a']++;
int mn=min(a.length(),b.length());
for(int i=0;i<mn;i++){
if(visa[i]>visb[i])return 1;
else if(visa[i]<visb[i])return 0;
}
if(a.length()>b.length())return 0;
else if(a.length()<b.length()) return 1;
else{
for(int i=0;i<mn;i++)
if(a[i]>b[i])return 0;
else if(a[i]<b[i])return 1;
return 1;
}
}
int main(){
int n=-1;
string ch;
cin>>ch;
int i=0;
while(i<=ch.length()){
if(ch[i]>='A'&&ch[i]<='Z'){
n++;
x[n]+=(ch[i]);
}
else if(ch[i]!='\0') x[n]+=ch[i];
i++;
}
n++;
sort(x,x+n,cmp);
for(int i=0;i<=n/2;i++)cout<<x[i];
cout<<endl;
return 0;
}
H: 答疑
思路:s+e+a小的放前面,一样的就把s+a小的放前面
(不保证完全对)代码:
struct student{
ll s,a,e;
};
student stu[1001];
bool cmp(const student n1,const student n2){
/*ll sum1=n1.a+n1.e+n1.s+n2.a+n2.s;
ll sum2=n2.a+n2.e+n2.s+n1.a+n1.s;
if(sum1==sum2)return n1.a+n1.s<n2.a+n2.s;
return sum1<sum2;
*/
ll sum1=n1.s+n1.a,sum2=n2.s+n2.a;
if(sum1+n1.e>sum2+n2.e)return 0;
else if(sum1+n1.e<sum2+n2.e)return 1;
else{
if(sum1>sum2)return 0;
else if(sum1<sum2)return 1;
else return 1;
}
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>stu[i].s>>stu[i].a>>stu[i].e;
}
sort(stu,stu+n,cmp);
ll ans=0,k=0;
for(int i=0;i<n;i++){
//cout<<stu[i].s<<" "<<stu[i].a<<" "<<stu[i].e<<endl;
k=k+stu[i].s+stu[i].a;
ans+=k;
//cout<<k<<endl;
k+=stu[i].e;
}
cout<<ans<<endl;
return 0;
}