Codeforces Round #451 (Div. 2) a - c
a.
题解:水题,判断该数模除10 ,与10 - 该数模除10 比较谁更小,输出小的那种情况
代码如下:
- #include <iostream>
- #include <stdio.h>
- #include <stack>
- #include <math.h>
- #include <map>
- #include <algorithm>
- #include <string.h>
- using namespace std;
- const double PI=acos(-1);
- int main()
- {
- int n;
- scanf("%d",&n);
- int m=n%10;
- if(m<=10-m)
- printf("%d\n",n-m);
- else
- printf("%d\n",n+10-m);
- return 0;
- }
b .
题意: 扩展欧几里德 ,但一直改不对,发现 数据最大1e7 1000ms 不会超时,故用暴力 ac
代码如下:
- #include <iostream>
- #include <stdio.h>
- using namespace std;
- typedef long long ll;
- void gcd(ll a,ll b,ll &d,ll &x,ll &y)
- {
- if(!b)
- {
- d=a;x=1;y=0;
- }
- else
- {
- gcd(b,a%b,d,y,x);
- y-=x*(a/b);
- }
- }
- int main()
- {
- ll n,a,b,x,y,g;
- cin>>n>>a>>b;
- gcd(a,b,g,x,y);
- if(n%g)
- puts("NO");
- else
- {
- int flag=1;
- if(n%a==0)
- {
- puts("YES");
- printf("%I64d 0\n",n/a);
- }
- else if(n%b==0)
- {
- puts("YES");
- printf("0 %I64d\n",n/b);
- }
- else
- {
- for(ll i=1;i<=10000000;i++) // main code
- {
- if((n-a*i)>=0&&(n-a*i)%b==0)
- {
- puts("YES");
- printf("%I64d %I64d\n",i,(n-a*i)/b);
- flag=0;
- break;
- }
- }
- if(flag)
- puts("NO");
- }
- }
- return 0;
- }
c
题解:
更是暴力,可以直接开数组暴力,但我用的set 和 map 优化了一下,将 那些字符串判断一下不是任何字符串的后缀 即可
代码如下:
- #include <iostream>
- #include <set>
- #include <map>
- #include <string.h>
- #include <vector>
- using namespace std;
- int lk(string str,string str1) // 判断str 是否是str1的后缀
- {
- int len=str.length(),len1=str1.length();
- if(len>=len1)
- return 0;
- for(int i=0;i<len;i++)
- if(str[len-1-i]!=str1[len1-1-i])
- return 0;
- return 1;
- }
- int main()
- {
- set<string>s;
- map<string,set<string> >my;
- s.clear();
- int n,m;
- string name,str;
- cin>>n;
- for(int i=0;i<n;i++)
- {
- cin>>name>>m;
- s.insert(name);
- for(int j=0;j<m;j++)
- {
- cin>>str;
- my[name].insert(str);
- }
- }
- cout<<s.size()<<endl;
- set<string>::iterator it1;
- set<string>::iterator it2;
- vector<string>v1;
- vector<string>v2;
- for(it1=s.begin();it1!=s.end();it1++)
- {
- v1.clear();
- v2.clear();
- cout<<*it1<<" ";
- for(it2=my[*it1].begin();it2!=my[*it1].end();it2++)
- v1.push_back(*it2);
- for(int i=0;i<v1.size();i++)
- {
- int flag=0;
- for(int j=0;!flag&&j<v1.size();j++)
- if(i!=j)
- {
- if(lk(v1[i],v1[j]))
- flag=1;
- }
- if(!flag)
- v2.push_back(v1[i]);
- }
- cout<<v2.size()<<" ";
- for(int i=0;i<v2.size();i++)
- {
- if(i==v2.size()-1)
- cout<<v2[i]<<endl;
- else
- cout<<v2[i]<<" ";
- }
- }
- return 0;
- }
init:看样子以后要首选lk暴力试探法啦。。。。。。