2017 Multi-University Training Contest

来源:互联网 发布:淘宝清库存 编辑:程序博客网 时间:2024/06/05 18:14
1001:Add More Zero
题目大意:求满足10^k<=2^m的最大的K。
#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;int main(){int m,cas=0;while(~scanf("%d",&m)){printf("Case #%d: %d\n",++cas,(int)(m*log(2)/log(10)));}return 0;}


1002:Balala Power!
题目大意:将若干只包含小写字母的字符串转换成26进制的数,输出这些字符串转换之后和最大的十进制数。
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std;#define ll long longconst int maxn=1e5+10;const int mod=1e9+7;struct node{    int num[maxn];    int id;    bool operator<(const node &r)const    {        for(int i=100000; i>=0; i--)        {            if(num[i]!=r.num[i]) return num[i]>r.num[i];        }        return 0;    }} a[28];bool vis[28];ll num[28],res[maxn];string s[maxn];int main(){    int n,cas=0;    res[0]=1;    for(int i=1; i<maxn; i++)    {        res[i]=res[i-1]*26;        res[i]%=mod;    }    while(~scanf("%d",&n))    {    for(int i=0;i<26;i++){for(int j=0;j<=100000;j++)a[i].num[j]=0;a[i].id=i;vis[i]=0;}        for(int i=0; i<n; i++)        {            cin>>s[i];            int l=s[i].size();            for(int j=0,k=l-1; j<l; j++,k--)            {                int t=s[i][k]-'a';                a[t].num[j]++;            }            if(l>1) vis[s[i][0]-'a']=1;        }        for(int i=0;i<26;i++){for(int j=0;j<100000;j++){a[i].num[j+1]+=a[i].num[j]/26;a[i].num[j]%26;}}sort(a,a+26);for(int i=25;i>=0;i--) num[a[25-i].id]=i;int t=25;while(vis[a[t].id]&&t){swap(num[a[t].id],num[a[t-1].id]);t--;}ll ans=0;for(int i=0;i<n;i++){int l=s[i].size();for(int j=0;j<l;j++){ans=(ans+num[s[i][j]-'a']*res[l-1-j]%mod)%mod;}}printf("Case #%d: %d\n",++cas,ans);    }    return 0;}


1008:Hints of sd0061
题目大意:用参数以及所给出函数生成n个数,然后,求排好序后的 n个数中,m 次查询,第 i 的数的值
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1e7+10;int a[110],id[110];unsigned s[maxn];unsigned ans[110];int n,m;unsigned x,y,z;unsigned func(){unsigned t;x ^= x << 16;x ^= x >> 5;x ^= x << 1;t = x;x = y;y = z;z = t ^ x ^ y;return z;}bool cmp(int x,int y){return a[x]<a[y];}int main(){int cas=0;while(~scanf("%d%d%d%d%d",&n,&m,&x,&y,&z)){for(int i=0;i<m;i++) scanf("%d",&a[i]),id[i]=i;a[m]=n,id[m]=m;for(int i=0;i<n;i++) s[i]=func();sort(id,id+m,cmp);for(int now,i=m-1,last=a[id[m]];i>=0;i--,last=now){now=a[id[i]];if(now==last) ans[id[i]]=s[now];else{nth_element(s,s+now,s+last);ans[id[i]]=s[now];}}printf("Case #%d:",++cas);for(int i=0;i<m;i++) printf(" %u",ans[i]);printf("\n");}    return 0;}


1011:KazaQ's Socks
题目大意:KazaQ有n双袜子,标号1到n放在柜子里,每天早上起床穿袜子选标号最小的一双。然后晚上回来将穿过的扔到篮子里。当篮子里的袜子数量为n-1的时候,就把这些袜子洗一下,第二天晚上再放回柜子里。问KazaQ在第K天穿的是哪一个标号的袜子。
#include<iostream>#include<cstdio>using namespace std;#define ll long longint main(){int n,cas=0;ll k;while(~scanf("%d%lld",&n,&k)){printf("Case #%d: ",++cas);if(k<=n) printf("%lld\n",k);else{k-=n;int t=k/(n-1);if(k%(n-1)==0){if(t&1) printf("%d\n",n-1);else printf("%d\n",n);}else printf("%lld\n",k%(n-1));}}return 0;}